redis-10.sorted_set类型
sorted_set 类型#
- 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
- 需要的存储结构:新的存储模型,可以保存可排序的数据
- sorted_set 类型:在 set 的存储结构基础上添加可排序字段
sorted_set 类型数据的基本操作#
添加数据
zadd key score1 member1 [score2 member2]
获取全部数据
zrange key start stop [WITHSCORES] zrevrange key start stop [WITHSCORES]
删除数据
zrem key member [member ...]
按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT] zrevrangebyscore key max min [WITHSCORES]
条件删除数据
zremrangebyrank key start stop zremrangebyscore key min max
注意:
- min 于 max 用于限定搜索查询的条件
- start 与 stop 用于限定查询范围,作用于索引,表示开始和结束索引
- offset 与 count 用于限定查询范围,作用与查询结果,表示开始位置和数据总量
获取集合数据总量
zcard key zcount key min max
集合交、并操作
zinterstore destination numkeys key [key ...] zunionstore destination numkeys key [key ...]
sorted_set 类型数据的扩展操作#
业务场景#
票选广东十大杰出青年,各类综艺选秀海选投票
各类资源网站 TOP10(电影,歌曲,游戏等)
聊天室活跃度统计
游戏好友亲密度
业务分析
- 为所有参与排名的资源建立排序依据
解决方案#
- 获取数据对应的索引(排名)
zrank key member zrevrank key member
- score 值获取与修改
zscore key member zincrby key increment member
Tips1:
- redis 应用于计数器组合排序功能对应的排名
sorted_set 类型数据操作的注意事项#
- score 保存的数据存储空间是 64 位,如果是整数范围是 - 9007199254740992~9007199254740992
- score 保存的数据也可以是一个双精度的 double 值,基于双精度浮点数的特征,可能会丢失精度,使用时 候要慎重
- sorted_set 底层存储还是基于 set 结构的,因此数据不能重复,如果重复添加相同的数据,score 值将被反 复覆盖,保留最后一次修改的结果
业务场景#
基础服务 + 增值服务类网站会设定各位会员的试用,让用户充分体验会员优势。例如观影试用 VIP、游戏 VIP 体验、云盘下载体验 VIP、数据查看体验 VIP。当 VIP 体验到期后,如果有效管理此类信息。即便对于正式 VIP 用户也存在对应的管理方式。
网站会定期开启投票、讨论,限时进行,逾期作废。如何有效管理此类过期信息。
解决方案#
对于基于时间线限定的任务处理,将处理时间记录为 score 值,利用排序功能区分处理的先后顺序
记录下一个要处理的时间,当到期后处理对应任务,移除 redis 中的记录,并记录下一个要处理的时间
当新任务加入时,判定并更新当前下一个要处理的任务时间
为提升 sorted_set 的性能,通常将任务根据特征存储成若干个 sorted_set。例如 1 小时内,1 天内,周内, 月内,季内,年度等,操作时逐级提升,将即将操作的若干个任务纳入到 1 小时内处理的队列中
获取当前系统时间
time
Tips2:
- redis 应用于定时任务执行顺序管理或任务过期管理
业务场景#
任务 / 消息权重设定应用
当任务或者消息待处理,形成了任务队列或消息队列时,对于高优先级的任务要保障对其优先处理,如何实现任务权重管理。
解决方案#
对于带有权重的任务,优先处理权重高的任务,采用 score 记录权重即可 多条件任务权重设定
如果权重条件过多时,需要对排序 score 值进行处理,保障 score 值能够兼容 2 条件或者多条件,例如外贸 订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单因 score 长度受限,需要对数据进行截断处理,尤其是时间设置为小时或分钟级即可(折算后)
先设定订单类别,后设定订单发起角色类别,整体 score 长度必须是统一的,不足位补 0。第一排序规则首 位不得是 0
- 例如外贸 101,国内 102,经理 004,员工 008。
- 员工下的外贸单 score 值为 101008(优先)
- 经理下的国内单 score 值为 102004
Tips3:
- redis 应用于即时任务 / 消息队列执行管理
本作品采用《CC 协议》,转载必须注明作者和本文链接