從 0 設計一個短鏈接服務:如何實現盡可能短、可變長的短網址系統?
在日常生活中,我們經常在短信、微博、廣告營銷中看到“短鏈接”,如:
https://t.cn/EXaQ4xY
https://bit.ly/3Yp9zJk
相比冗長復雜的原始 URL,短鏈接不僅更美觀、更易傳播,還能用于追蹤分析和跳轉控制。那么問題來了:
如果你是系統設計者,如何從零構建這樣一個短鏈接服務,滿足“盡可能短、隨著使用量增加再變長”的需求?
🧠 1. 問題分析:我們要解決什么?
輸入一個長鏈接,返回一個唯一且盡可能短的短鏈,且短鏈可以反向還原長鏈。
系統設計核心目標:
- ? 短鏈接越短越好(前期盡量短,后期按需增長)
- ? 能還原原始長鏈接
- ? 能支持高并發、高訪問量
- ? 保證唯一性、穩定性
?提示:不能直接用 MD5、SHA1,它們生成的都是固定長度(通常32~40位)的字符串,不滿足“盡量短、可變長”的要求。
💡 2. 設計思路:唯一 ID + 可變 Base62 編碼
我們采用如下經典架構:
📌 方案核心:唯一 ID + Base62 編碼
- 為每個長鏈接生成唯一 ID(如自增 ID、雪花算法、分布式 ID)
- 將 ID 編碼成字符串(使用 Base62 編碼:
0-9a-zA-Z
共 62 個字符) - 將短鏈和長鏈做持久化映射
舉例:
- 自增 ID:
100000
- 編碼成 Base62:
q0X1
- 最終短鏈接:
https://short.ly/q0X1
這種方案支持:
- 最初使用 6 位字符:最多 62? ≈ 56 億種組合
- 如果超過,則自動進位變成 7、8 位,滿足“前期短,后期可擴展”的設計目標
?? 3. 系統實現細節設計
① 唯一 ID 生成器
- 單機模式可用數據庫自增主鍵
- 分布式推薦使用:
- Twitter 雪花算法(Snowflake)
- Leaf、UidGenerator
- Redis 原子自增
② Base62 編碼/解碼
// 將 10 進制數字轉為 Base62 字符串
public static String encodeBase62(long id) {char[] chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();StringBuilder sb = new StringBuilder();while (id > 0) {sb.append(chars[(int) (id % 62)]);id /= 62;}return sb.reverse().toString();
}
反向解碼同理,按權展開還原為 ID。
③ 映射存儲設計(短鏈碼 ? 長鏈接)
數據庫表結構:
short_code | long_url | create_time |
---|---|---|
q0X1 | https://www.example.com/product/12345 | 2025-07-10 |
支持:
- 唯一約束(避免重復)
- TTL字段(支持臨時鏈接)
- 可加索引優化短鏈查詢
④ 反查設計(可選)
如你希望同一個長鏈接總是生成同一個短鏈接(冪等),可:
- 對長鏈接做 hash(如 SHA256)
- 用 hash 查表,若已存在則返回已有短鏈
🚀 4. 擴展功能設計(更強健)
功能 | 實現方式說明 |
---|---|
緩存加速訪問 | 使用 Redis 緩存 shortCode -> longUrl |
統計點擊次數 | 數據庫 + 緩存計數器,記錄跳轉事件 |
設置短鏈有效期 | TTL字段 + 定期清理任務 |
自定義短鏈碼 | 用戶自定義 code,存入映射表時做唯一性校驗 |
權限控制 / 防刷 | 加限流、鑒權邏輯,避免短鏈被猜測濫用 |
📊 5. 性能與可擴展性設計
場景 | 設計策略 |
---|---|
高并發訪問 | 加緩存、讀寫分離、加限流 |
存儲容量擴展 | 短鏈表分表、水平分庫分表 |
熱點短鏈保護 | 本地緩存 + Redis 預熱 |
容災恢復 | 定期備份、雙寫數據庫或異地容災 |
? 6. 總結:一句話記住
使用唯一 ID + Base62 編碼的方式,可以構建一個既短又高性能的短鏈接服務;通過懶增長編碼長度和緩存優化等手段,滿足從早期輕量到后期高并發的系統擴展需求。
采用 “唯一 ID + Base62 編碼” 的方式來設計短鏈接系統,初期生成的短鏈控制在 6 位以內,最多支持 62? ≈ 56 億個鏈接。當量級增加后,短鏈長度會自動增長到 7 位、8 位,以此實現變長編碼機制。所有映射關系會存入數據庫,熱門短鏈通過 Redis 緩存提速。系統支持反向解碼、去重、自定義短鏈、TTL、點擊統計等功能,具備良好的擴展性和容錯能力。