Skip to content
← 返回Redis列表
数据与原子性

Redis Sorted Set(有序集合) · 1. 定位:解决什么问题至2. 命令速查与示例 ​

返回分篇目录

本文按 Redis 8.2.10 核对编码与配置默认值;命令的引入版本另行标注。生产配置可能不同,可通过 CONFIG GET 查询。示例面向独立实验服务,运行结果和内存数字未在本次实测。

Redis Sorted Set(有序集合) ​

本文按 Redis 8.2.10 核对编码与配置默认值;命令的引入版本另行标注。生产配置可能不同,可通过 CONFIG GET 查询。示例面向独立实验服务,运行结果和内存数字未在本次实测。

1. 定位:解决什么问题 ​

ZSet 是“带分数、按分数有序的唯一成员集合”。排行榜、评级匹配、在线心跳与延迟任务都可以把排序依据映射成 score。Set 没有排名,List 维护插入顺序,Hash 只能按字段直接查找,三者都不直接提供分数范围查询。

基本操作示例 ​

text
ZADD learn:types:rank 10 alice 20 bob
ZINCRBY learn:types:rank 5 alice
ZRANGE learn:types:rank 0 1 REV WITHSCORES

预期先返回 bob 20,再返回 alice 15。相同分数会按成员字节顺序进一步排序,倒序会反转这个顺序;如果业务要求“先达到分数的人排前”,需要额外设计规则。

参考:Sorted Set。

游戏与后端场景 ​

场景分数与成员关键约束
在线状态score 为最后心跳时间,member 为 uid查询前清理超过阈值的成员;在线状态存在检测延迟
按评级匹配score 为 rating,按区间取候选人查找、资格校验和移除须原子化;ZPOPMIN 只弹出全局最低分,不表达指定区间
赛季排行榜score 为积分,member 为 uid,键带赛季 ID明确并列规则,分数更新是否允许降低
滑动窗口限流score 为请求时刻,member 为唯一请求标识清理、计数、添加须原子化;统一时钟与窗口边界
延迟任务score 为执行时刻,member 为任务 ID到期取出后消费者崩溃需恢复机制
热榜score 为热度衰减和时间窗口需显式设计,不能无限累计旧热度

2. 命令速查与示例 ​

按用途分组,共 35 项,覆盖 Redis 8.2.10 的本类型命令及子命令。点击命令名查看官方参数。示例在 redis-cli 中逐行输入,每次换例子前重置下面的教学数据。

准备与重置示例数据

在独立实验实例的 redis-cli 交互模式逐行输入,避免 shell 对引号、>、*、括号等符号进行解释。每个例子独立使用;换例子前重新执行下面的准备段,否则删除、弹出、过期和修改操作会影响后续结果。准备段仅重置列出的教学键,确认这些键不承载业务数据。

text
UNLINK learn:{zset}:a learn:{zset}:b learn:{zset}:lex learn:{zset}:out
ZADD learn:{zset}:a 10 alice 20 bob 30 carol
ZADD learn:{zset}:b 2 bob 4 dave
ZADD learn:{zset}:lex 0 a 0 b 0 c

示例的返回说明以刚完成准备段为前提,随机结果与剩余 TTL 不固定。带同一 {...} 的教学键便于在 Cluster 中满足相关多键操作的同槽要求。

成员与分数 ​

命令与用途示例与结果复杂度
ZADD
新增或更新分数
ZADD learn:{zset}:a 15 alice 40 dave
返回新增成员数 1,alice 被更新。
每个成员 O(log N)
ZINCRBY
原子加分
ZINCRBY learn:{zset}:a 5 alice
返回新分数 15。
O(log N)
ZSCORE
读取分数
ZSCORE learn:{zset}:a alice
返回 10。
O(1)
ZMSCORE
批量读取分数
ZMSCORE learn:{zset}:a alice bob missing
返回 10、20、空值。
O(M)
ZCARD
成员数量
ZCARD learn:{zset}:a
返回 3。
O(1)
ZRANDMEMBER
随机读取成员
ZRANDMEMBER learn:{zset}:a 2 WITHSCORES
读取随机两个不同成员及分数,不删除。
O(M)
ZSCAN
无序游标遍历
ZSCAN learn:{zset}:a 0 COUNT 10
不是按分数分页,使用返回游标继续。
单次 O(1)
完整 O(N)

排名与范围 ​

命令与用途示例与结果复杂度
ZCOUNT
分数范围计数
ZCOUNT learn:{zset}:a 10 20
返回 2。
O(log N)
ZLEXCOUNT
字典序范围计数
ZLEXCOUNT learn:{zset}:lex [a [b
同分集合中 a 到 b 共 2 项。
O(log N)
ZRANK
升序名次
ZRANK learn:{zset}:a bob
返回 1,名次从 0 起。
O(log N)
ZREVRANK
降序名次
ZREVRANK learn:{zset}:a bob
返回 1。
O(log N)
ZRANGE
排名、分数或字典序范围查询
ZRANGE learn:{zset}:a 10 20 BYSCORE WITHSCORES
返回 alice 10、bob 20;默认按排名,没有 BYRANK。
O(log N+M)
ZRANGESTORE
保存范围查询结果
ZRANGESTORE learn:{zset}:out learn:{zset}:a 0 1
覆盖 out,保存 alice、bob 并返回 2。
O(log N+M)

删除与弹出 ​

命令与用途示例与结果复杂度
ZREM
删除指定成员
ZREM learn:{zset}:a alice
返回 1。
O(M log N)
ZREMRANGEBYRANK
删除名次区间
ZREMRANGEBYRANK learn:{zset}:a 0 1
删除 alice、bob,返回 2。
O(log N+M)
ZREMRANGEBYSCORE
删除分数区间
ZREMRANGEBYSCORE learn:{zset}:a -inf 20
删除分数不超过 20 的两项。
O(log N+M)
ZREMRANGEBYLEX
删除字典序区间
ZREMRANGEBYLEX learn:{zset}:lex [a [b
同分集合删除 a、b,返回 2。
O(log N+M)
ZPOPMIN
弹出最低分
ZPOPMIN learn:{zset}:a 1
移除并返回 alice 10。
O(M log N)
ZPOPMAX
弹出最高分
ZPOPMAX learn:{zset}:a 1
移除并返回 carol 30。
O(M log N)
ZMPOP
从多个集合弹出
ZMPOP 2 learn:{zset}:a learn:{zset}:b MIN COUNT 2
从首个非空集合 a 弹出两项。
O(K+M log N)
BZPOPMIN
等待最低分弹出
BZPOPMIN learn:{zset}:a 1
最多等待 1 秒,准备数据下立即返回 alice。
O(log N)
BZPOPMAX
等待最高分弹出
BZPOPMAX learn:{zset}:a 1
准备数据下立即返回 carol。
O(log N)
BZMPOP
等待多集合弹出
BZMPOP 1 2 learn:{zset}:a learn:{zset}:b MIN COUNT 2
最多等待 1 秒,从首个非空集合弹出两项。
O(K+M log N)

集合运算 ​

命令与用途示例与结果复杂度
ZINTER
有序集合交集
ZINTER 2 learn:{zset}:a learn:{zset}:b WITHSCORES
bob 同时存在,默认求和后分数为 22。
最坏 O(Nmin×K+M log M)
ZINTERCARD
交集成员数
ZINTERCARD 2 learn:{zset}:a learn:{zset}:b
返回 1。
最坏 O(Nmin×K)
ZINTERSTORE
保存交集
ZINTERSTORE learn:{zset}:out 2 learn:{zset}:a learn:{zset}:b
覆盖 out,保存 bob 22,返回 1。
最坏 O(Nmin×K+M log M)
ZUNION
有序集合并集
ZUNION 2 learn:{zset}:a learn:{zset}:b WITHSCORES
同名成员分数默认求和,不是简单选最大值。
O(T+M log M)
ZUNIONSTORE
保存并集
ZUNIONSTORE learn:{zset}:out 2 learn:{zset}:a learn:{zset}:b
覆盖 out,保存 4 个成员。
O(T+M log M)
ZDIFF
有序集合差集
ZDIFF 2 learn:{zset}:a learn:{zset}:b WITHSCORES
返回 alice 10、carol 30。
最坏 O(T+(N−M) log N)
ZDIFFSTORE
保存差集
ZDIFFSTORE learn:{zset}:out 2 learn:{zset}:a learn:{zset}:b
覆盖 out,返回 2。
最坏 O(T+(N−M) log N)

继续阅读