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 WITHSCORESbob 同时存在,默认求和后分数为 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) |
继续阅读
- 数据与原子性
- 数据与原子性
- 完整实践