标准答案

  1. 使用数据库自增或全局唯一 ID,再用 Base62 等编码生成短码,避免直接暴露可猜的敏感业务 ID。
  2. 短码建立唯一索引,冲突时重试或使用不可预测的随机码并处理竞争。
  3. 跳转读取可缓存,失效和删除要有策略;点击统计异步记录并允许重复或采样。

题目解析

短链接创建的事实是短码到目标对象的唯一映射,必须由数据库唯一约束裁决并定义覆盖、过期和删除语义。编码算法只负责表示 ID,不自动提供安全性。

跳转路径可以使用缓存降低延迟,但缓存失效或旧值不能让短码指向错误目标。修改和删除要有版本、失效与回源策略,敏感目标不能因为短码可猜就暴露。

点击统计属于旁路事件,不应阻塞跳转主路径。异步统计允许重复、采样或延迟,但要单独说明隐私、反作弊和最终统计语义。

代码示例

Base62 编码应对 0 和负数定义边界:

TypeScript
const alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
function encode(id: bigint) {
  if (id === 0n) return alphabet[0]
  let result = ""
  while (id > 0n) { result = alphabet[Number(id % 62n)] + result; id /= 62n }
  return result
}

常见误区

  • 误区:用随机短码却没有唯一约束。改正:数据库建立唯一索引,冲突时重试或返回明确结果。
  • 误区:同步写统计导致跳转被统计服务拖慢。改正:将统计事件异步化,并定义丢失、重复和采样策略。
  • 误区:把可猜短码当成访问授权。改正:敏感对象仍需用户和租户权限校验,短码只负责定位。

作者信息