短链接系统怎么设计?先把跳转、唯一性与失效讲清楚
先明确需求边界
最小需求是提交长 URL,取得短链接,访问短链接时跳转。进一步确认链接是否需要过期、自定义短码、访问统计和修改目标。这些功能会影响缓存与状态设计,不能一上来就假设需要全球多活和完整分析平台。
本文不假定某个真实流量规模。面试时先询问读写比例与峰值,再根据容量估算决定组件;没有数字时,明确采用单机数据库起步的假设。
一条最小主链路
创建接口验证 URL 后生成短码,写入映射表;跳转接口按短码查询,检查状态与过期时间,再返回重定向。数据至少包括短码、目标 URL、创建时间、过期时间和状态,并对短码建立唯一约束。
允许的目标协议通常限制为 HTTP 与 HTTPS。展示或管理页面要正确转义 URL;如果服务端还会抓取目标生成预览,需要另加外连目标限制,避免访问内部资源。
短码如何保证唯一
可以把唯一整数编码为短字符串,也可以生成随机短码并在冲突时重试。顺序 ID 简单,但容易被枚举;随机方案需要足够的空间和唯一约束兜底。对长 URL 做哈希后直接截断,不能在没有冲突处理的情况下保证唯一。
同一个长 URL 是否复用短码是产品决策。若创建者、过期规则或统计归属不同,就不一定应该去重。不能仅凭目标地址相同覆盖已有链接配置。
缓存与跳转状态码
读多写少时,可以缓存短码到目标的映射,但缓存有效期不能超过链接剩余寿命。链接被停用或修改后,需要失效对应缓存。无效短码也可以短时缓存,但要注意后续新建同名短码的可见性。
永久重定向可能被浏览器与中间缓存长期保存,如果业务允许修改目标,使用时要特别谨慎。状态码选择应结合是否永久、是否需要保留方法和缓存语义,而不是认为 301 总比 302 快。
失败与增长怎么处理
数据库写入失败不能返回一个实际不存在的短链接;读取失败应与“链接不存在”区分。高流量跳转不应同步等待复杂统计,统计可以异步处理,允许的丢失范围由业务决定。热点压力出现后再增加缓存与容量,避免预建不必要的分片系统。
还需要考虑钓鱼与恶意目标举报,以及对创建接口限流。短链接隐藏了目标,用户提示与管理处置是实际业务风险的一部分。
怎样验收
验证创建后可跳转、并发创建不产生同码覆盖、过期或停用后不可继续使用,以及缓存失效后读取新状态。本文没有运行压测,不提供虚构容量。面试表达应沿“需求、模型、主链路、唯一性、一个失败场景、扩展依据”展开。