許多候選人會想:找一個算法將長 URL 壓縮為短碼,並能逆向還原。這在信息論上是不可能的——短碼空間 (如 62¹⁰⁰) 遠小於長 URL 空間,必然發生碰撞;若真能無損壓縮任意長度到固定短度,所有壓縮軟體都可歇業了。

核心邏輯:不壓縮,只分配唯一 ID。
短碼 → 長 URL 映射https://domain/短碼例:第 1 條 → 0,第 11 條 → a,第 62 條 → 10。
存儲層用 10 進制 ID,輸出時轉 62 進制:
string toBase62(long long id) {
const char* chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (id == 0) return "0";
string res;
while (id > 0) {
res.push_back(chars[id % 62]);
id /= 62;
}
reverse(res.begin(), res.end());
return res;
}
方案:LRU 緩存「最近」映射,而非全量存儲。
邏輯分片:N 個發號器,第 i 個只發尾號 ≡ i (mod N) 的 ID,步長 N。
例:1000 節點,步長 1000,互不干擾,線性擴展。物理部署可從邏輯分片平滑遷移。
| 維度 | 301 永久重定向 | 302 臨時重定向 |
|---|---|---|
| HTTP 語義 | 符合 (短鏈固定不變) | 不完全符合 |
| 瀏覽器緩存 | 會緩存,減輕服務器壓力 | 不緩存,每次請求到服務器 |
| 點擊統計 | 無法統計 (瀏覽器直跳) | 可精準統計 (流經服務器) |
| 推薦 | 純跳轉場景 | 需數據分析場景 (推薦) |
短鏈點擊數據是極高價值的用戶行為數據源,**302 雖增壓力,但數據價值遠超成本**。
[Client] → [API Gateway] → [Shorten Service] → [ID Generator (Sharded)]
↓
[Cache: LRU Long→Short]
↓
[Storage: KV (Short→Long)]
↓
[Redirect] ← [Resolve Service] ← [Storage]