列表、集合、有序集合三者的異同點
數據結構 | 是否允許重復元素 | 是否有序 | 有序依據 | 應?場景 |
列表 | 是 | 是 | 索引下標 | 時間軸、消息隊列等 |
集合 | 否 | 否 | 標簽、社交等 | |
有序集合 | 否 | 是 | 分數 | 排?榜系統、社交等 |
特點
1.?元素唯一性:Zset 中的每個元素都是唯一的,不能重復。即使兩個元素的值相同,但分數(score)不同,它們也會被視為不同的元素。
2.?有序性:Zset 中的元素會根據其分數(score)自動排序。分數可以是任意的浮點數;默認情況下,Zset 按照分數從小到大排序,但也可以通過命令反轉排序方向;如果兩個元素的分數相同,則按照元素值的字典序排序。
3.?高效操作:Zset 支持高效的插入、刪除和查找操作,時間復雜度為 O(logN)。內部使用跳表(skiplist)或壓縮列表(ziplist)實現,對于小集合(默認 128 個元素以內),使用壓縮列表可以節省內存;對于大集合,跳表提供了高效的范圍查詢和排序功能。
內部編碼
1.?壓縮列表(ziplist):當有序集合滿足元素個數小于 128 并且每個元素的值的大小小于?64 字節時,Redis 使用 壓縮列表(ziplist) 作為內部編碼。壓縮列表通過緊湊的存儲方式減少內存占用,適合存儲小數據量的有序集合。
2.?跳表(skiplist):當有序集合不滿足壓縮列表的條件時(例如元素個數超過 128 或某個元素值大于 64 字節),Redis 會切換到 跳表(skiplist) 作為內部編碼。跳表是一種基于多級索引的有序鏈表結構,支持快速的范圍查詢和元素查找,時間復雜度為 O(logN)。跳表能夠動態調整索引層級,適應不同規模的數據,適合存儲大量數據的有序集合。
命令
ZADD
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]
- XX:僅僅?于更新已經存在的元素,不會添加新元素。
- NX:僅?于添加新元素,不會更新已經存在的元素。
- CH:默認情況下,ZADD 返回的是本次添加的元素個數,但指定這個選項之后,就會還包含本次更新的元素的個數。
- INCR:此時命令類似 ZINCRBY 的效果,將元素的分數加上指定的分數。此時只能指定?個元素和分數。

ZCARD
ZCARD key

ZCOUNT
ZCOUNT key min max

ZRANGE
ZRANGE key start stop [WITHSCORES]

ZREVRANGE
ZREVRANGE key start stop [WITHSCORES]
ZRANGEBYSCORE
ZRANGEBYSCORE key min max [WITHSCORES]

ZPOPMAX
ZPOPMAX key [count]

BZPOPMAX
BZPOPMAX key [key ...] timeout
ZPOPMIN
ZPOPMIN key [count]

BZPOPMIN
BZPOPMIN key [key ...] timeout
ZRANK
ZRANK key member

ZREVRANK
ZREVRANK key member

ZSCORE
ZSCORE key member
ZREM
ZREM key member [member ...]
ZREMRANGEBYRANK
ZREMRANGEBYRANK key start stop

ZREMRANGEBYSCORE
???????ZREMRANGEBYSCORE key min max

ZINCRBY
ZINCRBY key increment member
ZINTERSTORE
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
ZUNIONSTORE
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
使?場景
zadd user:ranking:2025-02-14?3 james
zincrby user:ranking:2022-03-15 1 james
zrem user:ranking:2025-02-14 tom
zrevrangebyrank user:ranking:2025-02-14 0 9
hgetall user:info:tom
zscore user:ranking:2025-02-14 mike
zrank user:ranking:2025-02-14 mike