redis的sorted set的应用场景

发布于:2025-04-16 ⋅ 阅读:(33) ⋅ 点赞:(0)

Redis 的 Sorted Set(有序集合,简称 ZSet) 结合了 Set 的去重特性 和 按分数(score)排序 的特性,非常适合需要 高效排序 或 范围查询 的场景。以下是它的典型应用场景及示例:

  1. 实时排行榜
    场景:游戏积分榜、电商热销榜、热搜排名
    核心命令:

bash
复制
ZADD leaderboard 5000 “PlayerA” 3000 “PlayerB” # 添加分数
ZREVRANGE leaderboard 0 9 WITHSCORES # 获取Top10(降序)
ZINCRBY leaderboard 100 “PlayerA” # 增加玩家分数
优势:

自动按分数排序,无需手动维护顺序

支持高效的范围查询(如 TopN、第 10-20 名)

  1. 延迟队列/定时任务
    场景:订单超时取消、定时提醒
    实现方式:

bash
复制
ZADD delay_queue 1630000000 “task:order:123” # 分数=执行时间戳
ZRANGEBYSCORE delay_queue 0 <当前时间戳> # 获取到期任务
ZREM delay_queue “task:order:123” # 任务完成后删除
优势:

利用分数排序特性自动按时间顺序执行任务

避免轮询数据库,性能更高

  1. 优先级任务调度
    场景:高优先级任务优先处理
    示例:

bash
复制
ZADD tasks 1 “urgent:report” 3 “normal:cleanup” # 分数越小优先级越高
ZRANGE tasks 0 0 WITHSCORES # 获取最高优先级任务
4. 时间轴/历史记录
场景:用户浏览历史、操作日志(按时间排序)
命令:

bash
复制
ZADD user:123:history 1629999999 “pageA” 1630000000 “pageB” # 分数=时间戳
ZREVRANGE user:123:history 0 9 # 获取最近10条记录
5. 地理位置附近检索(简化版)
场景:查找附近的店铺
实现:

bash
复制
ZADD shops 5.2 “storeA” 3.1 “storeB” # 分数=距离(km)
ZRANGEBYSCORE shops 0 5 # 查找5km内的店铺
6. 带权重的标签系统
场景:热门标签排序
操作:

bash
复制
ZINCRBY tags 1 “python” # 标签热度+1
ZREVRANGE tags 0 4 # 获取Top5标签
7. 滑动窗口统计
场景:统计最近1小时的请求量
实现:

bash
复制
ZADD requests 1629999999 “req1” # 分数=请求时间戳
ZREMRANGEBYSCORE requests -inf <1小时前的时间戳> # 清理旧数据
ZCARD requests # 统计当前请求数
Sorted Set 核心优势
特性 说明
自动排序 插入时自动按分数排序(O(log N) 复杂度)
高效范围查询 ZRANGEBYSCORE、ZRANK 等操作性能优异
去重 成员唯一,适合需要唯一性约束的场景(如用户投票)
灵活性 分数可重复(如多人同分),成员不可重复
与其他结构对比
需求 String List Hash Set ZSet
需要排序 ❌ ❌ ❌ ❌ ✅
范围查询 ❌ ⚠️ ❌ ❌ ✅
去重 ❌ ❌ ❌ ✅ ✅
权重/分数关联 ❌ ❌ ❌ ❌ ✅
性能注意事项
单 ZSet 建议元素数小于 1万(大数据量时考虑分片)

分数(score)支持 64位浮点数,范围 -9007199254740992 到 9007199254740992

大数据量范围查询时,优先用 ZSCAN 替代 ZRANGE 避免阻塞


网站公告

今日签到

点亮在社区的每一天
去签到