4. Design Tiny URL
Scenario
- 根据 long URL 生成一个 short URL
- 根据 short URL 还原 Long URL 并且跳转
- Long URL 和 short URL 必须是一一对应吗
- Short URL 长时间没人用是不是要释放?
- 日活用户?假设 100M
- QPS
- 假设每个用户每天发 0.1 条带 URL 的微博
- Write QPS: 100M * 0.1 / 86400 ~ 100
- Peak QPS: 100 * 3 ~ 300
- 假设每个用户每天点击一个 URL
- Read QPS: 100M * 1 / 86400 ~ 1000
- Peak QPS: 1000 * 3 ~ 3000
- 假设每个用户每天发 0.1 条带 URL 的微博
- 每天产生的新的 URL 所占的存储
- 100M * 0.1 ~ 10M 条
- 每条 URL 长度 100,共 1G
- 1T 硬盘可以用三年
Service
- URL Service
- 函数: UrlService.encode(url), UrlService.decode(url)
- 端口: GET /
, POST /shorten/ data: {url: 'example'}
使用什么算法
- hash function - 不可行,容易出现冲突
- 随机生成 short URL + 数据库去重: 会越来越慢
- 随机生成一个,如果数据库中没有,就绑定
- 禁止转换 Base62: 效率高,但是依赖全局的自增 ID
- 把 6 位的 short URL 看作一个 62 进制的数字 (0-9, a-z, A-Z)
- 每个 short URL 对应一个整数
- 每个整数表示 table 中的 primary key
Storage
- No transaction
- 没有复杂的 query
因此可以使用 NoSQL
Scale
- 可以利用 cache 提速,比如使用 Memcached 存储 short url 和 long url 的对应关系
- 可以在多地架设服务器提高速度,比如中国和美国各架设一台服务器