题目重点:唯一短码不等于不可猜测,访问统计不应阻塞重定向。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 只给短URL主题,训练明确create long URL→short code、redirect、可选expire/custom alias。其它原题额外scope待核。
- 支持http/https目标,是否公开可猜和恶意URL防护另定;不把短码当授权token。
解题路线
- URLMap(code,target,owner,expires_at,state,version)以code唯一约束;生成随机base62 code,冲突retry或使用ID编码。固定长度L空间62^L,但随机生日碰撞不能按空间耗尽才考虑。
- 创建带client request ID避免超时重试产多条;同long URL是否全局同code取决于owner/analytics/expiry合同,不能随意dedup把不同用户所有权混在一起。
- redirect查cache→store并检查expiry/state,返回明确temporary/permanent重定向策略。永久重定向可能被浏览器长期缓存,若目标允许更新更适合可控缓存策略。
- 自定义alias唯一检查与写原子,删除保留tombstone或不复用以避免旧链接指向别人。访问统计异步事件,失败不影响正常redirect,去重/采样视analytics精度合同。
- 热点short code缓存多副本,cache过期不能延长已expired URL;negative cache防大量无效code请求。目标validation与rate限制保护服务,不宣称短URL自动保证目标安全。
手动走一遍
自定义alias由两请求同时抢占,唯一写只让一方成功。链接expiry到期但cache仍有target,读取时校验expires_at,不等TTL结束才停止。
规模与取舍
create平均O(1)索引写,redirect平均O(1)cache/lookup,随机碰撞重试按占用率增加;统计bytes/峰热门链接与总体请求分开估算。
易错点与追问
容易失分的边界
- URL字符串相同就强行合并不同owner创建。
- 重用旧code会让旧书签意外跳到新目标。
继续深挖
- 要求自定义alias可改目标时,缓存与redirect code如何选?
- 私密分享链接为什么需更高随机熵与访问控制?
