应用场景
通常在一些需要经历一段时间或者到达某个指定时间节点才会执行的功能,比如以下这些场景:
- 订单超时提醒
- 收货自动确认
- 会议提醒
- 代办事项提醒
为什么使用延时队列
对于数据量小且实时性要求不高的需求来说,最简单的方法就是定时扫描数据库。
但是,当数量达到数百万、上千万级别且时,定时扫库就显得非常低效且消耗资源,
甚至有些时间间隔小实时性要求高的情况,上一次扫描还没结束,下一次就又开始了,
这时候如果使用延时队列就会比较合适
延时队列的几种方式:
- Quartz 定时任务实现扫库
- DelayQueue JDK中提供了一组实现延迟队列的API
- Redis sorted set
- Redis 过期键监听回调
- RabbitMQ 死信队列
- RabbitMQ 基于插件实现延迟队列
- Wheel 时间轮训算法
Redisson 实现延时队列
顾名思义 Redis son 就是 Redis 的儿子,举个栗子先:
1.引入 pom
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>${lastest.version}</version>
</dependency>
2.封装一个 RedissonQueue 类
@Service
public class RedissonQueue {
public static final String QUEUE = "delayQueue";
// 默认超时时间,30秒
public static final Integer DEFAULT_TIMEOUT = 30;
@Resource
private RedissonClient redissonClient;
// 加入任务并设置到期时间
public void offer(String taskId, Integer timeout) {
RDelayedQueue<String> delayedQueue &