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 类型数据操作的注意事项

  1. score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
  2. score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
  3. sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果

sorted_set 类型应用场景

场景一

各网站的会员增值服务,当vip权限到期后如何对此类信息进行有效管理 开启时效性话题,怎么进行管理

解决方案

  1. 对于基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序
  2. 记录下一个要处理的时间,当到期后处理对应任务,移除redis中的记录,并记录下一个要处理的时间 当新任务加入时,判定并更新当前下一个要处理的任务时间
  3. 为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set。例如1小时内,1天内,周内,月内,季内,年度等,操作时逐级提升,将即将操作的若干个任务纳入到1小时内处理的队列中

获取当前系统时间

time

redis 应用于定时任务执行顺序管理或任务过期管理

场景二

任务/消息权重设定应用

当任务或者消息待处理,形成了任务队列或消息队列时,对于高优先级的任务要保障对其优先处理,如 何实现任务权重管理。

解决方案

  1. 对于带有权重的任务,优先处理权重高的任务,采用score记录权重即可

     多条件任务权重设定
     如果权重条件过多时,需要对排序score值进行处理,保障score值能够兼容2条件或者多条件,
     例如外贸订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单
     
    
  2. 因score长度受限,需要对数据进行截断处理,尤其是时间设置为小时或分钟级即可(折算后)

  3. 先设定订单类别,后设定订单发起角色类别,整体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 应用于即时任务/消息队列执行管理

全部评论

相关推荐

去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务