以下是 Redis 中 Set 和 ZSet 的詳細對比 ,涵蓋定義、特性、命令、適用場景及總結表格:
1. 核心定義
數據類型 Set ZSet(Sorted Set) 定義 無序的、唯一的字符串集合,元素不重復。 有序的、唯一的字符串集合,每個元素關聯一個 分數(score) ,按分數排序。
2. 核心特性對比
2.1 共同點
元素唯一性 :相同元素無法重復添加。存儲結構 :底層基于哈希表實現。集合運算 :支持交集、并集、差集操作(如 SINTER
、ZINTERSTORE
)。
2.2 不同點
特性 Set ZSet 元素排序 無序(插入順序不保證)。 按 分數(score) 排序(從小到大默認)。 元素與分數關聯 無分數,僅存儲元素值。 每個元素必須關聯一個分數(double 類型)。 范圍查詢 無法直接按范圍查詢元素。 可通過分數范圍(ZRANGEBYSCORE
)或索引范圍(ZRANGE
)查詢元素。 更新操作 僅能通過 SADD
添加或 SREM
刪除元素。 可通過 ZADD
修改元素的分數,從而改變其排序位置。 存儲空間 僅存儲元素值。 需額外存儲元素值和分數,空間占用略高。
3. 常用命令對比
3.1 Set 常用命令
命令 功能 示例 SADD key member
添加元素到集合。 SADD tags "spring" "redis"
SMEMBERS key
獲取集合所有元素。 SMEMBERS tags
→ 輸出 ["spring", "redis"]
SISMEMBER key member
判斷元素是否存在于集合。 SISMEMBER tags "spring"
→ 返回 1
(存在)。SINTER key1 key2
計算兩個集合的交集。 SINTER tags other_tags
→ 輸出共同元素。
3.2 ZSet 常用命令
命令 功能 示例 ZADD key score member
添加元素并設置分數。 ZADD leaderboard 90 Alice 85 Bob
→ Alice 分數 90,Bob 分數 85。ZRANGE key start stop
獲取指定索引范圍的元素(按分數升序)。 ZRANGE leaderboard 0 -1
→ 輸出 ["Bob", "Alice"]
(按分數升序)。ZREVRANGE key start stop
獲取指定索引范圍的元素(按分數降序)。 ZREVRANGE leaderboard 0 -1
→ 輸出 ["Alice", "Bob"]
。ZRANGEBYSCORE key min max
獲取指定分數范圍的元素。 ZRANGEBYSCORE leaderboard 80 90
→ 輸出分數在 80-90 之間的元素。ZREM key member
刪除指定元素。 ZREM leaderboard Alice
→ 移除 Alice。
4. 適用場景對比
4.1 Set 的典型場景
去重 :存儲唯一元素(如用戶標簽、已訪問 URL)。集合運算 :計算多個集合的交集、并集(如共同好友、共同興趣)。快速存在性判斷 :檢查元素是否已存在(如防止重復提交)。
4.2 ZSet 的典型場景
排行榜 :按分數排序(如積分排名、銷量排名)。優先級隊列 :分數表示優先級,按分數提取元素(如任務調度)。帶時間戳的隊列 :分數設為時間戳,實現按時間排序的隊列。
5. 總結表格
對比維度 Set ZSet 排序 無序(插入順序不保證)。 按分數排序(升序或降序)。 元素與分數 無分數,僅存儲值。 每個元素關聯一個分數(double 類型)。 范圍查詢 不支持分數/索引范圍查詢。 支持按分數范圍(ZRANGEBYSCORE
)或索引范圍(ZRANGE
)查詢。 更新操作 無法直接修改元素(只能刪除后重新添加)。 可通過修改分數調整元素位置。 適用場景 去重、集合運算、存在性判斷。 排行榜、優先級隊列、帶權重的有序數據。 存儲空間 僅存儲元素值。 需額外存儲元素值和分數,空間略高。
6. 選擇建議
選 Set 的場景 :
需要存儲唯一元素且無需排序。 需要快速判斷元素是否存在。 需要集合運算(如交集、并集)。 選 ZSet 的場景 :
需要元素按分數排序(如排行榜)。 需要動態調整元素的優先級(如任務隊列)。 需要按分數范圍查詢元素(如篩選高分用戶)。
通過合理選擇,可以最大化 Redis 的性能和功能優勢。