列表、集合、有序集合三者的异同点
数据结构 | 是否允许重复元素 | 是否有序 | 有序依据 | 应⽤场景 |
列表 | 是 | 是 | 索引下标 | 时间轴、消息队列等 |
集合 | 否 | 否 | 标签、社交等 | |
有序集合 | 否 | 是 | 分数 | 排⾏榜系统、社交等 |
特点
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