开发者学堂课程【Redis 入门到精通(基础篇):数据类型-sorted_set 实现时效性任务管理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/764/detail/13393
数据类型-sorted_set 实现时效性任务管理
内容介绍
一、Sorted_set 类型数据操作的注意事项
二、sorted_set 类型应用场景
三、Tips14
一、Sorted_set 类型数据操作的注意事项
●score 保存的数据存储空间是64位,如果是整数范围是-9007199254740992-9007199254740992
●score 保存的数据也可以是一个双精度的 double 值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
●sorted_set 底层存储还是基于 set 结构的,因此数据不能重复,如果重复添加相同的数据,score 值将被反复覆盖,保留最后一次修改的结果
这是一个数字,之前操作的是整数,但是也可以是小数,整数是有范围的,要有一定的风险意识,如果要用小数,这是一个双精度double值,意味着计算机对一个小数存在有可能无法描述的情况,这时如果需要排序,那么就会存在问题,出现不精准的情况,有时候会丢掉这个精度值,所以要慎重使用,set放置数据,放入重复数据,会输入失败,但是 sorted_set 则是会覆盖掉。
接下来实验一下,zadd test1 11 aa,然后 zrange test1 0 -1 withscores,得到数据,然后进行修改,zadd test1 22 aa,重复操作,zadd test1 33 aa,得到最后覆盖为aa 33。
二、sorted_set 类型应用场景
业务场景
基础服务+增值服务类网站会设定各位会员的试用,让用户充分体验会员优势。例如观影试用VIP、游戏VIP体验、云盘下载体验VIP、数据查看体验VIP。
当VIP体验到期后,如果有效管理此类信息。即便对于正式VIP用户也存在对应的管理方式。
网站会定期开启投票、讨论,限时进行,逾期作废。如何有效管理此类过期信息。
有些场景会进行增值服务,在常规情况增加更多的便捷优惠效果,各种长期短期的会员等的商品,到期后怎样管理,这个就需要服务器进行管理,这个就需要我们在服务器进行一些设计。
解决方案
●对于基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序
●记录下一个要处理的时间,当到期后处理对应任务,移除redis中的记录,并记录下一个要处理的时间
●当新任务加入时,判定并更新当前下一个要处理的任务时间
●为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set.例如1小时内,1天内,周内,月内,季内,年度等,操作时逐级提升,将即将操作的若干个任务纳入到1小时内处理的队列中
●获取当前系统时间
Time
对每一个任务设定一个时间线,记录一个score值,然后利用排序功能排好,无论时间的长短,都可以拿到一个根据时间长短已经排好序的处理的列表,然后到达了时间进行处理,如果你的记录不在队列中,那么就无法使用特殊功能,然后具体操作就是对于我们现在的,
添加zadd ts 1509802345 uid:001,zadd ts 1509802390 uid:007,zadd ts 1510384284 uid:888
,这样就有一个天然的排序,然后进行排序,zrange ts 0 -1 withscores,就可以看出来具体的排序情况,然后对用户进行提醒,并且在到达时间后就可以将这个数据挪出来,然后下一个用户就会自动上移,每次提醒即将到期的用户。
然后我们使用一个代码,time,进行查看时间,每使用一次,就可以看到这个存在的时间,一共两行,第一行是秒,下面就是比秒还要小的单位,然后通过时间的变化,我们就可以做到这种时间上面的控制是否继续提供某一项服务。
三、Tips14
Redis 应用于定时任务执行顺序管理或者任务过期管理。