功能:这段代码的功能是使用Redis实现一个延迟队列。具体来说,它可以将一些需要延迟处理的任务存入队列,然后在适当的时间点取出并执行。
目的:这种延迟队列的设计可以用于各种需要延迟处理的场景,例如延迟发送邮件、延迟执行某些耗时操作等。
使用场景:这段代码可以用于任何需要延迟处理任务的场景,例如在电商网站中,用户下单后,可以将订单确认邮件的发送任务存入延迟队列,然后在订单确认后的一段时间(例如1小时)再发送邮件。
1.队列存值
public void addToDelayedQueue(String backId, NotificationRecordParam param) { redisTemplate.opsForValue().set(CommonConst.REDIS_QUERY_KEY + backId, JSONUtil.toJsonStr(param), 10, TimeUnit.MINUTES); // 设置两分钟的缓存 redisTemplate.opsForZSet().add(CommonConst.QUERY_KEY, backId, System.currentTimeMillis() + 2 * 60 * 1000); }
2.队列出值
public void processDelayedQueue() { // 取出当前key在当前时间的数据 Set<Object> jobs = redisTemplate.opsForZSet().rangeByScore(CommonConst.QUERY_KEY, 0, System.currentTimeMillis()); if (jobs != null && jobs.size() > 0) { for (Object job : jobs) { String o = (String) redisTemplate.opsForValue().get(CommonConst.REDIS_QUERY_KEY + job); log.info("定时处理消息:{}", o); if (!StringUtils.isEmpty(o)) { // 逻辑处理。。。 } // 清除缓存 redisTemplate.opsForZSet().remove(CommonConst.QUERY_KEY, job); } } }
主要逻辑:
addToDelayedQueue
方法:这个方法接收一个任务ID和一个任务参数,然后将任务参数以JSON格式存入Redis的值类型数据结构,并将任务ID和当前时间加上延迟时间存入Redis的有序集合数据结构。processDelayedQueue
方法:这个方法首先从Redis的有序集合数据结构中取出所有到期(即当前时间大于等于任务ID加上延迟时间)的任务ID,然后遍历这些任务ID,从Redis的值类型数据结构中取出对应的任务参数,并执行任务。执行完任务后,将任务ID从Redis的有序集合数据结构中移除。