【延时队列】Spring定时任务+Redis的简单实现 - Go语言中文社区

【延时队列】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的时候就会将该元素弹出。

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

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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/nakiri_arisu/article/details/89642001
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-04 14:16:04
  • 阅读 ( 2035 )
  • 分类:Redis

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢