开发者学堂课程【Redis 入门到精通(基础篇):数据类型-sorted_set 带有权重的任务管理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/764/detail/13394
数据类型-sorted_set 带有权重的任务管理
sorted_set 类型应用场景
业务场景
任务/消息权重设定应用
当任务或者消息待处理,形成了任务队列或消息队列时,对于高优先级的任务要保障对其优先处理,如何实现任务权重管理。
现在如果要做任务队列或者消息队列,我们一般按照list来做,按照一个顺序来进行,但是如果加上权重怎么解决,任务队列消息队列用list是无法区分的,这个时候只能用编程做区分,模型方面可以解决,用sorted_set的score属性,利用这个特征来做。
解决方案
●对于带有权重的任务,优先处理权重高的任务,采用score记录权重即可
添加几个任务,zadd tasks 4 order:id:005,然后zadd task 1 order:id:425,zadd tasks 9 order:id:345,添加进去后,进行排序,zrange taks 0 -1 withscores,就看到了依次需要处理的任务,这样仅仅是看了全部,怎样移掉呢,就需要用zrevrange tasks 0 0,取出第一个,然后zrem tasks order:id:345,
然后查询zrange taks 0 -1 withscores就缺少了去掉的那一个,在操作时,由于无法保证原子性操作,就可能会出问题,在移除时并没有去掉我们要去的数据,或者说过程中插队进来了,那么就比较麻烦,
我们讲到的事务就可以解决这个问题,然后reids也可加一个模型在sorted_set里面,加一个api接口,能够从某一端剔除数据,多一个pop的操作,然后我们带有权限的任务队列消息队列就完成了。
多条件任务权重设定
如果权重条件过多时,需要对排序score值进行处理,保障score值能够兼容2条件或者多条件,例如外贸订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单
●因score长度受限, 需要对数据进行截断处理,尤其是时间设置为小时或分钟级即可(折算后)
●先设定订单类别,后设定订单发起角色类别,整体score长度必须是统的,不足位补0。第一排序规则首位不得是0
●例如外贸101,国内102,经理004,员工008。
●员工下的外贸单score值为101008 (优先)
●经理下的国内单score值为102004
如果任务权限不是一个值组成的,我们就使用多个值组合进行,提供一个场景,有一些任务单要处理,优先规则是外贸订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单;
有这样一个分绩,因为score有限,我们就需要做截断,按时间排列,就需要把权重规则截成若干部分,比方说时间十位,截取到只剩六位,如果可以就使用,不可以使用就后八位决定,有一定截断,然后最后连接在一起,连接有一个坑,就是补0操作,接下来进行一个模拟。
去模拟环境,zadd tt 102004 order:id:1,然后 zadd tt 101008 order:id:2,zrevrange tt 0 -1 withscores,得到排列顺序,根据我们的权重规则,进行一个排列优先级,zrange tt 0 -1,这个时候有一个坑,zadd ts 14 order:id:3,然后zadd ts 1332 order:id:4,此时没有按位比对的问题,现在就出现了问题,就要进行补位,变成相同的位数,空位补0,优先级是怎样排列。