redis延迟队列实现

47 阅读1分钟
@EnableScheduling
@Service
public class DelayedTaskService {
    private static final String DELAYED_QUEUE_KEY = "delayedQueue";

    @Autowired
    private StringRedisTemplate redisTemplate;

    // 添加任务到队列
    public void addTaskToQueue(String taskId) {
        long score = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(15L); // 15秒后过期
        redisTemplate.opsForZSet().add(DELAYED_QUEUE_KEY, taskId, score);
    }

    // 处理要过期的数据,定时任务10秒执行一次
    @Scheduled(fixedRate = 10000)
    public void processDelayedTask() {
        long score = System.currentTimeMillis();
        Set<String> taskIds = redisTemplate.opsForZSet().rangeByScore(DELAYED_QUEUE_KEY, 0, score);

        if (!CollectionUtils.isEmpty(taskIds)) {
            for (String taskId : taskIds) {
                // 执行业务逻辑
                System.out.println("执行了任务:" + taskId);
                // 从队列中移除已执行的任务
                redisTemplate.opsForZSet().remove(DELAYED_QUEUE_KEY, taskId);
            }
        }
    }
}
  • 测试
@GetMapping("/addTask")
public void addTask(){
    String taskId = UUID.randomUUID().toString();
    delayedTaskService.addTaskToQueue(taskId);
}