短链接系统怎么设计?短码生成、跳转和高并发访问怎么处理?
🧑💻 面试官:设计短链接系统,你会怎么做?
🙋♂️ 我:把长地址哈希后截取六位,访问时跳转。
🧑💻 面试官:截断碰撞了怎么办?一个短码是否允许改目标?
🙋♂️ 我:要查重,也需要明确是否可修改。
🧑💻 面试官:跳转缓存多久?恶意地址、热链接和统计故障会不会影响核心访问?
短码生成只是入口。真正要守住的是映射唯一、跳转正确、更新可控与滥用防护。
面试速答(60 秒版)
先确认需求:短码长度、自定义码、过期、目标能否修改、读写规模和安全要求。核心数据是短码到目标地址及状态的映射,存储用唯一约束防止并发冲突。
可以采用随机码加碰撞重试,或唯一 ID 编码。Base62 是表示方式,不是加密;截断哈希也不能保证无碰撞。
读取链路按短码查缓存或持久存储,再返回合适重定向。目标可变时要控制重定向和缓存有效期,不能把永久缓存与随时修改混在一起。
统计异步处理并明确可靠性,主链路还要应对热点、失效与恶意目的地址。容量估算基于假设,不随口报生产数据。

知识点详解:从创建映射到访问跳转的完整路径
需求先问清,才知道缓存能保留多久
假设活动短链允许每天换目标,同时提供过期时间。它和永久指向一篇公开文章的短链不是同一规则。
创建时应验证地址格式和允许的协议,保存所有者、目标、创建和到期时间、状态等必要字段。是否允许同一长地址创建多个短码,也属于产品约定。
容量用假设估算:每天新增数量乘保留天数得到映射条数,再考虑索引、复制和元数据。这里是规划公式,不代表已有真实流量。
随机码与唯一 ID,都要解释失败条件
随机码空间若有 62 种字符、长度 L,理论空间为 62^L,但随着数量增长仍有碰撞概率。创建应以数据库唯一约束和有限重试处理,不能先查不存在再无保护写入。
唯一 ID 再编码便于分配,却可能被枚举;需要不可预测性时另行设计。自定义短码还要和系统生成码使用一致的占用规则。
规范化 URL 后再去重,也要谨慎。查询参数顺序、大小写和片段可能具有不同语义,不能随意删参数认定同一个目标。
访问路径要把修改和缓存一起考虑
先检查映射是否有效,再跳转到目标。常用缓存提高读取能力,但目标修改和禁用后,旧映射需要按承诺的时限失效。
永久重定向可能被客户端或中间层保存,若用户随时改目标,就不能只保证数据库已改。应选择与可变性匹配的重定向和缓存策略。
热短链可能集中访问同一个键,可以评估本地缓存、边缘和请求合并;失效时仍需避免所有请求一起压回数据库。
统计和安全,不要挡住正常跳转
点击统计可以异步发送事件,是否允许少量丢失、是否去重机器人、如何定义一次点击都要说明。统计不可用时,通常不应无条件拖死跳转主链路。
短链接本来就提供外部跳转,但仍要防钓鱼、滥用和危险协议,提供举报、禁用及相关检查。若后台主动抓目标预览,还需要额外防 SSRF,不能直接请求任意内网地址。
验收包括并发创建同码、碰撞、改目标、过期、禁用、热访问与统计故障,而不是只演示成功跳了一次。
本题机制参考:HTTP 语义 RFC 9110、OWASP 重定向检查、UUID RFC 9562。
面试官继续追问
Base62 能保护目标不被猜到吗?
不能。它只是编码表示,若来源 ID 可预测,编码后也可能可预测。
先查短码不存在再插入够吗?
不够,并发之间仍有竞态。需要可靠唯一约束或等效分配机制。
所有短链都用 301 吗?
不应固定。目标是否永久、客户端缓存和更新需求决定选择。
面试速记卡
- 需求:可变目标、到期、自定义码与安全范围。
- 生成:随机或唯一 ID 编码,碰撞与并发要处理。
- 存储:短码唯一约束,不能只靠先查。
- 读取:缓存、重定向与修改承诺一致。
- 运维:热点、异步统计和滥用防护。
公司面试真题
这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。
浏览公司面试真题 →