以下是 Redis 中 有序集合(Sorted Set) 类型的详细整理,适用于排行榜、优先队列、延迟任务、评分系统等应用场景,涵盖命令用法、典型示例、高级技巧与优化建议。
📚 目录
🧾 有序集合简介
- Redis 的 Sorted Set(有序集合)是一个不重复的字符串集合,每个元素关联一个 分数(score)
- 元素按分数自动排序,可按分数范围或排名访问
- 使用 跳表(Skip List) 作为底层结构,支持高性能范围查询
- 适用于排行榜、调度队列、时间线等应用
🔧 核心命令大全
命令 | 描述 |
---|---|
ZADD key score member [score member ...] | 添加一个或多个带分数的成员 |
ZREM key member [member ...] | 移除一个或多个成员 |
ZINCRBY key increment member | 增加某个成员的分数 |
ZRANK key member | 获取成员的排名(从小到大) |
ZREVRANK key member | 获取成员的排名(从大到小) |
ZSCORE key member | 获取成员的分数 |
ZRANGE key start stop [WITHSCORES] | 按排名正序获取成员 |
ZREVRANGE key start stop [WITHSCORES] | 按排名倒序获取成员 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 按分数范围正序获取 |
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] | 按分数范围倒序获取 |
ZREMrangeBYRANK key start stop | 删除指定排名范围内的成员 |
ZREMrangeBYSCORE key min max | 删除指定分数范围内的成员 |
ZCARD key | 获取成员总数 |
ZCOUNT key min max | 获取指定分数区间的成员数量 |
`ZUNIONSTORE destination numkeys key [key …] [WEIGHTS w1 w2 …] [AGGREGATE SUM | MIN |
ZINTERSTORE destination numkeys key [key ...] | 求交集并存储 |
🧪 典型使用场景
✅ 排行榜系统
ZADD leaderboard 100 user1
ZADD leaderboard 250 user2
ZINCRBY leaderboard 50 user1 # user1 加分
ZREVRANGE leaderboard 0 9 WITHSCORES # 前10名
✅ 延迟任务队列(使用时间戳作为 score)
ZADD delayed_tasks 1713000000 "task_001"
ZRANGEBYSCORE delayed_tasks 0 1713001000 # 获取截止当前的任务
ZREM delayed_tasks "task_001"
✅ 带权重的标签权重系统
ZADD user:1001:tags 1.0 "music"
ZADD user:1001:tags 2.5 "tech"
ZINCRBY user:1001:tags 1.0 "tech" # tech 权重+1
🛠 高级用法与技巧
🎯 分页拉取排行榜
ZREVRANGE leaderboard 0 9 WITHSCORES # 第 1 页
ZREVRANGE leaderboard 10 19 WITHSCORES # 第 2 页
🧾 统计一定分数区间的用户数
ZCOUNT leaderboard 100 200
🔄 有序集合合并(加权)
ZUNIONSTORE total_scores 2 game1 game2 WEIGHTS 1 0.5
🧹 清理过期任务
ZREMRANGEBYSCORE delayed_tasks 0 1712000000
⚠️ 注意事项与性能建议
注意点 | 建议说明 |
---|---|
❗ 元素唯一,但分数可重复 | ZADD 中的 member 是唯一的,重复将覆盖原分数 |
✅ 排名基于分数 | 排序严格依赖 score,score 越大,排名越靠前(ZREVRANGE) |
⏱ 大范围查询请加 LIMIT | 防止返回过多数据导致 Redis 卡顿 |
🧠 跳表结构高效 | 插入、查询、排名操作均为 O(log N) |
⚠ 不支持按插入时间排序 | 如果需要时间顺序,请使用时间戳作为 score |
📎 参考资料
如果你想创建一个完整的排行榜系统、延迟任务队列或带权重的标签推荐系统,我可以帮你生成对应的 Redis 设计结构和代码示例(Python、Node.js、PHP、Go 等),只需告诉我你的需求!
发表回复