← 每日面试题 学习看板

短链5亿次生成20亿跳转P99-50ms

面试题/未分类处理/2026/09/短链5亿次生成20亿跳转P99-50ms.md

短链5亿次生成20亿跳转P99-50ms

首次归档:2026-09-13 R5 | 难度:高阶

来源文档:interview-2026-09-13.md


原题

场景:

设计一个短链接系统,支撑 日均 5 亿次短链生成 + 20 亿次跳转,跳转 P99 < 50ms,可用性 99.99%。

问题:

  1. 短链 ID 生成方案怎么选?对比:自增 + base62 vs Snowflake vs 哈希 vs 发号器,给出推荐及理由。
  2. 跳转链路如何做到 P99 < 50ms?缓存策略、DB 读写分离怎么设计?
  3. 自定义短链冲突如何检测和处理?99.99% 可用性下,缓存雪崩、热点 key、单机故障如何兜底?

我的回答(2026-09-13)

(未作答,进入讲解模式)

点评(2026-09-13)

优点:暂无

不足:ID 生成选型、多级缓存、高可用兜底是系统设计必考。

补充:完整讲解见下。

得分:N/A

讲解

问题1:短链 ID 生成方案选型

方案优点缺点适用场景
自增 + base62顺序、无冲突、ID 短DB 瓶颈低并发
Snowflake无中心依赖时钟回拨高并发
哈希无状态冲突率高低冲突要求
发号器(分布式)无冲突、可控需额外服务超高并发

推荐:发号器 + base62 编码

// Redis 原子递增
String key = "id_gen:" + LocalDate.now();
Long id = redisTemplate.opsForValue().increment(key);
return Base62Encoder.encode(id);

问题2:跳转链路 P99 < 50ms

延迟预算(总 50ms):

环节延迟预算
DNS 解析1-5ms
CDN 边缘5-10ms
短链服务查询10-20ms
302 跳转5-10ms
缓冲10ms

多级缓存:

L1: 本地缓存(Caffeine)→ L2: Redis → L3: DB
缓存层命中率延迟
L130%< 1ms
L260%5-10ms
L310%50-100ms
加权平均-~10ms

DB 设计:short_link_0 ~ short_link_15 按 hash(short_code) % 16 分表。

问题3:自定义短链冲突 + 高可用

冲突检测:

if (exists(customCode)) throw new DuplicateException();
// 唯一索引兜底(并发场景)
CREATE TABLE short_link (short_code VARCHAR(16) PRIMARY KEY, ...);

缓存雪崩防护:随机过期时间 + 热点 key 永不过期

热点 key 防护:滑动窗口计数器检测热点 → 强制加载本地缓存

单机故障:多实例 + LB + 客户端重试

降级:Redis 挂 → 直查 DB;DB 挂 → 熔断返回错误