简单描述一下需求(跳出复杂的业务,简单描述一下):
机构甲会给机构乙推送任务,然后每个不同类型的任务比如A/B…等都可以设置不同的超时时间,当这条任务(我们以taskId来看作是一条唯一的任务)到期时后台调用方法去发送微信通知。
大概的需求就是上面的了。
思路:
- 每条任务在分配的时候查询其机构对应该种任务的超时时间,比如taskId = 1 种类为A, 这个机构的A任务设置为20分钟。
- 调用redis的zadd方法,
zadd(Integer.parseInt(map.get("mins")) * 60 * 1000 + System.currentTimeMillis());
将该任务到期的时间写入redis的sorted set中。 - 利用springboot的定时任务,不断获得到期的元素
zrangeByScore(key, 0, currentTimeMillis);
获取0到当前时间内的元素 - 进行逻辑处理和消息推送,完毕后
zrem(key, member);
移除有序set中的元素
解释一下,比如你当前时间是1, 加了3就是4然后你将4插入zset中. 然后currentTime是3, 这时候就没算到期,但当currentTime等于4或者5的时候就会将该元素弹出。
这种适用于对于提醒的要求没有即时性的要求。就是说一小时到期了,我不要求精准在到期的那一刻提醒,多几秒多几分都无所谓的这种。
实际场景下