系统设计面试题

系统设计:短链服务(TinyURL)

设计一个每天1亿新URL的短链服务。

为什么面试官会问这道题

最常考的系统设计warm-up——这题卡壳后面更难的就没机会了。

如何回答

  1. 1

    澄清:读写比(常见100:1)、过期策略、是否允许自定义alias、是否要点击统计。

  2. 2

    容量:1亿写/天≈1160写QPS、10万读QPS。存储:1亿*365*5年≈2000亿URL。每条500字节→100TB。

  3. 3

    ID生成两种:(1)Hash(长URL)→base62短码;冲突retry+增量。(2)分布式计数器(snowflake)+base62——无冲突但ID顺序可猜。

  4. 4

    存储:KV(Cassandra/DynamoDB)以短码为key。上Redis缓存——URL访问长尾分布,命中率90%+。

  5. 5

    CDN/边缘:热门短链边缘返回。全球读<10ms。

参考回答示例

我先问:每天多少URL、允不允许自定义、要不要点击分析、过期多久。1亿/天≈1200写QPS、10万读QPS(按100:1)。ID我用分布式计数器+base62——snowflake给64位单调ID、base62缩到10-11字符。公开URL"可猜"没关系;业务要求不可猜就hash+salt或加密随机。存储Cassandra按短码分片,上面Redis LRU。最热1%短码前面挂CDN。写入靠本地ID区段分配批量化,DB只看10 QPS而不是1200。常见追问:自定义别名(去重)、防刷(按用户和域限速)、点击统计(异步写Kafka)。

实用技巧

  • Base62(a-zA-Z0-9)7字符有62^7≈3.5万亿个组合,短链管够。

  • 别拿MD5做短码——冲突且可猜。计数器+base62或随机更好。

  • 即答侠存了参考设计文档——白板上不用现算QPS/存储。

常见问题

为什么不直接用UUID?

太长(36字符)。用户要的是7-10字符。UUID也不大致有序,B+树写性能差。

自定义别名怎么实现?

单独命名空间——写入时DB查重,冲突返409。保留一批"系统"前缀避免冲突。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠