redis数据类型-sorted_set
目录名称
sorted_set 类型数据的基本操作
添加数据
zadd key score1 member1 [score2 member2]
获取全部数据
zrange key start stop [WITHSCORES]
zrevrange key start stop [WITHSCORES]
删除数据
zrem key member [member ...]
127.0.0.1:6379> zadd scores 94 zs
(integer) 1
127.0.0.1:6379> zadd scores 100 ls
(integer) 1
127.0.0.1:6379> zadd scores 88 ww
(integer) 1
127.0.0.1:6379> zadd scores 69 wj
(integer) 1
127.0.0.1:6379> zrange scores 0 -1
1) "wj"
2) "ww"
3) "zs"
4) "ls"
127.0.0.1:6379> zrange scores 0 -1 withscores
1) "wj"
2) "69"
3) "ww"
4) "88"
5) "zs"
6) "94"
7) "ls"
8) "100"
127.0.0.1:6379> zrevrange scores 0 -1 withscores
1) "ls"
2) "100"
3) "zs"
4) "94"
5) "ww"
6) "88"
7) "wj"
8) "69"
127.0.0.1:6379> zrem scores ww
(integer) 1
127.0.0.1:6379> zrevrange scores 0 -1 withscores
1) "ls"
2) "100"
3) "zs"
4) "94"
5) "wj"
6) "69"
127.0.0.1:6379>
按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
注意
1.min与max用于限定搜索查询的条件
2.start与stop用于限定查询范围,作用于索引,表示开始和结束索引
3.offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量
127.0.0.1:6379> zrange scores 0 -1 withscores
1) "wangwu"
2) "45"
3) "qingxi"
4) "54"
5) "zhangsan"
6) "61"
7) "wj"
8) "69"
9) "zhaoliu"
10) "76"
11) "lisi"
12) "88"
13) "wuji"
14) "91"
127.0.0.1:6379> zrangebyscore scores 50 80 withscores
1) "qingxi"
2) "54"
3) "zhangsan"
4) "61"
5) "wj"
6) "69"
7) "zhaoliu"
8) "76"
127.0.0.1:6379> zrangebyscore scores 50 99 withscores
1) "qingxi"
2) "54"
3) "zhangsan"
4) "61"
5) "wj"
6) "69"
7) "zhaoliu"
8) "76"
9) "lisi"
10) "88"
11) "wuji"
12) "91"
127.0.0.1:6379> zrangebyscore scores 50 99 withscores limit 0 3 withscores
1) "qingxi"
2) "54"
3) "zhangsan"
4) "61"
5) "wj"
6) "69"
127.0.0.1:6379> zremrangebyscore scores 30 70
(integer) 4
127.0.0.1:6379> zrange scores 0 -1 withscores
1) "zhaoliu"
2) "76"
3) "lisi"
4) "88"
5) "wuji"
6) "91"
127.0.0.1:6379> zremrangebyrank scores 0 1
(integer) 2
127.0.0.1:6379> zrange scores 0 -1
1) "wuji"
获取集合数据总量
zcard key
zcount key min max
集合交、并操作
zinterstore destination numkeys key [key ...]
zunionstore destination numkeys key [key ...]
127.0.0.1:6379> zcard scores
(integer) 4
127.0.0.1:6379> zrange scores 0 -1
1) "jack"
2) "tom"
3) "lucy"
4) "wuji"
127.0.0.1:6379> zcount scores 80 100
(integer) 2
127.0.0.1:6379> zrange scores 0 -1 withscores
1) "jack"
2) "56"
3) "tom"
4) "77"
5) "lucy"
6) "87"
7) "wuji"
8) "91"
sorted_set扩展操作
业务场景
直播房间在线人数热点排序
投票海选排序
资源型网站资源热度排序
好友亲密度排序等
业务分析
为业务资源进行排序,根据排序结果获取相对应索引
解决方案
获取数据对应的索引(排名)
zrank key member
zrevrank key member
score值获取与修改
zscore key member
zincrby key increment member
127.0.0.1:6379> zadd movies 187 a
(integer) 1
127.0.0.1:6379> zadd movies 298 b
(integer) 1
127.0.0.1:6379> zadd movies 65 c
(integer) 1
127.0.0.1:6379> zadd movies 94 d
(integer) 1
127.0.0.1:6379> zrank movies b
(integer) 3
127.0.0.1:6379> zrevrank movies b
(integer) 0
127.0.0.1:6379> zscore movies a
"187"
127.0.0.1:6379> zincrby movies 1 a
"188"
sorted_set 类型数据操作的注意事项
- score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
- score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
- sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
sorted_set 类型应用场景
场景一
各网站的会员增值服务,当vip权限到期后如何对此类信息进行有效管理 开启时效性话题,怎么进行管理
解决方案
- 对于基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序
- 记录下一个要处理的时间,当到期后处理对应任务,移除redis中的记录,并记录下一个要处理的时间 当新任务加入时,判定并更新当前下一个要处理的任务时间
- 为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set。例如1小时内,1天内,周内,月内,季内,年度等,操作时逐级提升,将即将操作的若干个任务纳入到1小时内处理的队列中
获取当前系统时间
time
redis 应用于定时任务执行顺序管理或任务过期管理
场景二
任务/消息权重设定应用
当任务或者消息待处理,形成了任务队列或消息队列时,对于高优先级的任务要保障对其优先处理,如 何实现任务权重管理。
解决方案
-
对于带有权重的任务,优先处理权重高的任务,采用score记录权重即可
多条件任务权重设定 如果权重条件过多时,需要对排序score值进行处理,保障score值能够兼容2条件或者多条件, 例如外贸订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单
-
因score长度受限,需要对数据进行截断处理,尤其是时间设置为小时或分钟级即可(折算后)
-
先设定订单类别,后设定订单发起角色类别,整体score长度必须是统一的,不足位补0。
第一排序规则首位不得是0
例如外贸101,国内102,经理004,员工008。 员工下的外贸单score值为101008(优先) 经理下的国内单score值为102004
127.0.0.1:6379> zadd port 102004 order:id:1
(integer) 1
127.0.0.1:6379> zadd port 101008 order:id:2
(integer) 1
127.0.0.1:6379> zrevrange port 0 -1 withscores
1) "order:id:1"
2) "102004"
3) "order:id:2"
4) "101008"
redis 应用于即时任务/消息队列执行管理