【延时队列】Spring定时任务+Redis的简单实现

简单描述一下需求(跳出复杂的业务,简单描述一下):

机构甲会给机构乙推送任务,然后每个不同类型的任务比如A/B…等都可以设置不同的超时时间,当这条任务(我们以taskId来看作是一条唯一的任务)到期时后台调用方法去发送微信通知。

大概的需求就是上面的了。


思路:

  1. 每条任务在分配的时候查询其机构对应该种任务的超时时间,比如taskId = 1 种类为A, 这个机构的A任务设置为20分钟。
  2. 调用redis的zadd方法,zadd(Integer.parseInt(map.get("mins")) * 60 * 1000 + System.currentTimeMillis());将该任务到期的时间写入redis的sorted set中。
  3. 利用springboot的定时任务,不断获得到期的元素 zrangeByScore(key, 0, currentTimeMillis);获取0到当前时间内的元素
  4. 进行逻辑处理和消息推送,完毕后zrem(key, member);移除有序set中的元素

解释一下,比如你当前时间是1, 加了3就是4然后你将4插入zset中. 然后currentTime是3, 这时候就没算到期,但当currentTime等于4或者5的时候就会将该元素弹出。

这种适用于对于提醒的要求没有即时性的要求。就是说一小时到期了,我不要求精准在到期的那一刻提醒,多几秒多几分都无所谓的这种。

实际场景下
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值