Redis 的 Sorted Set(有序集合,簡稱 ZSet) 結合了 Set 的去重特性 和 按分數(score)排序 的特性,非常適合需要 高效排序 或 范圍查詢 的場景。以下是它的典型應用場景及示例:
- 實時排行榜
場景:游戲積分榜、電商熱銷榜、熱搜排名
核心命令:
bash
復制
ZADD leaderboard 5000 “PlayerA” 3000 “PlayerB” # 添加分數
ZREVRANGE leaderboard 0 9 WITHSCORES # 獲取Top10(降序)
ZINCRBY leaderboard 100 “PlayerA” # 增加玩家分數
優勢:
自動按分數排序,無需手動維護順序
支持高效的范圍查詢(如 TopN、第 10-20 名)
- 延遲隊列/定時任務
場景:訂單超時取消、定時提醒
實現方式:
bash
復制
ZADD delay_queue 1630000000 “task:order:123” # 分數=執行時間戳
ZRANGEBYSCORE delay_queue 0 <當前時間戳> # 獲取到期任務
ZREM delay_queue “task:order:123” # 任務完成后刪除
優勢:
利用分數排序特性自動按時間順序執行任務
避免輪詢數據庫,性能更高
- 優先級任務調度
場景:高優先級任務優先處理
示例:
bash
復制
ZADD tasks 1 “urgent:report” 3 “normal:cleanup” # 分數越小優先級越高
ZRANGE tasks 0 0 WITHSCORES # 獲取最高優先級任務
4. 時間軸/歷史記錄
場景:用戶瀏覽歷史、操作日志(按時間排序)
命令:
bash
復制
ZADD user:123:history 1629999999 “pageA” 1630000000 “pageB” # 分數=時間戳
ZREVRANGE user:123:history 0 9 # 獲取最近10條記錄
5. 地理位置附近檢索(簡化版)
場景:查找附近的店鋪
實現:
bash
復制
ZADD shops 5.2 “storeA” 3.1 “storeB” # 分數=距離(km)
ZRANGEBYSCORE shops 0 5 # 查找5km內的店鋪
6. 帶權重的標簽系統
場景:熱門標簽排序
操作:
bash
復制
ZINCRBY tags 1 “python” # 標簽熱度+1
ZREVRANGE tags 0 4 # 獲取Top5標簽
7. 滑動窗口統計
場景:統計最近1小時的請求量
實現:
bash
復制
ZADD requests 1629999999 “req1” # 分數=請求時間戳
ZREMRANGEBYSCORE requests -inf <1小時前的時間戳> # 清理舊數據
ZCARD requests # 統計當前請求數
Sorted Set 核心優勢
特性 說明
自動排序 插入時自動按分數排序(O(log N) 復雜度)
高效范圍查詢 ZRANGEBYSCORE、ZRANK 等操作性能優異
去重 成員唯一,適合需要唯一性約束的場景(如用戶投票)
靈活性 分數可重復(如多人同分),成員不可重復
與其他結構對比
需求 String List Hash Set ZSet
需要排序 ? ? ? ? ?
范圍查詢 ? ?? ? ? ?
去重 ? ? ? ? ?
權重/分數關聯 ? ? ? ? ?
性能注意事項
單 ZSet 建議元素數小于 1萬(大數據量時考慮分片)
分數(score)支持 64位浮點數,范圍 -9007199254740992 到 9007199254740992
大數據量范圍查詢時,優先用 ZSCAN 替代 ZRANGE 避免阻塞