以下是 Redis 中 有序集合(Sorted Set) 类型的详细整理,适用于排行榜、优先队列、延迟任务、评分系统等应用场景,涵盖命令用法、典型示例、高级技巧与优化建议。


📚 目录

  1. 有序集合简介
  2. 核心命令大全
  3. 典型使用场景
  4. 高级用法与技巧
  5. 注意事项与性能建议
  6. 参考资料

🧾 有序集合简介

  • 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 SUMMIN
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 等),只需告诉我你的需求!