本发明属于redis领域,尤其是涉及一种基于redis实现高性能延时队列方法。
背景技术:
1、对于延时任务,常见的方案就是扫描数据库表,就是用一个后台进程,每隔一段时间扫描数据库的整张数据表,判断每个任务是否达到触发的条件;有些mq消息队列可以支持延时消息;扫描数据库表缺点是有延迟,不能再指定的时间里触发,对于时效性高的场景,这种方案是不能满足需求的;mq消息队列存在问题:延时任务需要重新更新时间无法做到,因为消息发出去后,无法收回。
技术实现思路
1、有鉴于此,本发明旨在提出一种基于redis实现高性能延时队列方法,以有效利用项目中经常使用的redis缓存中间件,解决了网站会对用户推送延时任务的需要,同时使用集群模式有效的避免单点故障造成的服务中断。
2、为达到上述目的,本发明的技术方案是这样实现的:
3、一种基于redis实现高性能延时队列方法,包括以下步骤:
4、s1、利用redis的zset结构将任务的执行时间作为score,要执行的任务数据作为value,存放在zset中;
5、s2、为每个任务key创建相同数量的轮询线程,定时查询zset的score分数最小的元素;
6、s3、轮询线程查询出任务后,将该任务写入到消息队列中。
7、进一步的,在步骤s1中,为每个延时任务分配一个任务key,避免一个key存储在数据量变多以后导致查询速度变慢,如果任务量增长通过扩容redis key的数量来容纳增长的数量。
8、进一步的,在步骤s2中,用zrangebyscore key-inf+inf limit 0 1withscores命令来实现;如果最小的分数小于等于当前时间戳,就将该任务取出来执行,否则休眠一段时间后再查询。
9、进一步的,在步骤s3中,由任务处理服务进行从消息队列取消息,然后执行业务。
10、进一步的,如在实际的业务中,还依赖数据库写入数据则先修改数据库然后再向redis写入数据,如果redis写入失败,发送一条消息重新进行补偿处理保证数据的一致性。
11、进一步的,本方案公开了一种电子设备,包括处理器以及与处理器通信连接,且用于存储所述处理器可执行指令的存储器,所述处理器用于执行一种基于redis实现高性能延时队列方法。
12、进一步的,本方案公开了一种服务器,包括至少一个处理器,以及与所述处理器通信连接的存储器,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,以使所述至少一个处理器执行一种基于redis实现高性能延时队列方法。
13、进一步的,本方案公开了一种计算机可读取存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现一种基于redis实现高性能延时队列方法。
14、相对于现有技术,本发明所述的一种基于redis实现高性能延时队列方法具有以下有益效果:
15、本发明所述的一种基于redis实现高性能延时队列方法,提供了一种redis实现高性能延时队列的方法,特别适用于活动结束前一定时间给用户推送消息、优惠券过期前一定时间给用户推送消息、秒杀时下单后一定时间内未付款就自动取消订单等场景,同时本方案中延时任务是保存在redis里面的,redis具有数据持久化的机制,可以有效的避免延时任务数据的丢失,另外,redis还可以通过哨兵模式、集群模式有效的避免单点故障造成的服务中断。
1.一种基于redis实现高性能延时队列方法,其特征在于,包括以下步骤:
2.根据权利要求1所述的一种基于redis实现高性能延时队列方法,其特征在于,在步骤s1中,为每个延时任务分配一个任务key,避免一个key存储在数据量变多以后导致查询速度变慢,如果任务量增长通过扩容redis key的数量来容纳增长的数量。
3.根据权利要求1所述的一种基于redis实现高性能延时队列方法,其特征在于,在步骤s2中,用zrangebyscore key-inf+inf limit 0 1withscores命令来实现;如果最小的分数小于等于当前时间戳,就将该任务取出来执行,否则休眠一段时间后再查询。
4.根据权利要求1所述的一种基于redis实现高性能延时队列方法,其特征在于,在步骤s3中,由任务处理服务进行从消息队列取消息,然后执行业务。
5.根据权利要求1所述的一种基于redis实现高性能延时队列方法,其特征在于:如在实际的业务中,还依赖数据库写入数据则先修改数据库然后再向redis写入数据,如果redis写入失败,发送一条消息重新进行补偿处理保证数据的一致性。
6.一种电子设备,包括处理器以及与处理器通信连接,且用于存储所述处理器可执行指令的存储器,其特征在于:所述处理器用于执行上述权利要求1-5任一所述的一种基于redis实现高性能延时队列方法。
7.一种服务器,其特征在于:包括至少一个处理器,以及与所述处理器通信连接的存储器,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述处理器执行,以使所述至少一个处理器执行如权利要求1-5任一所述的一种基于redis实现高性能延时队列方法。
8.一种计算机可读取存储介质,存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现权利要求1-5任一项所述的一种基于redis实现高性能延时队列方法。