redis 做延迟队列?

62 阅读1分钟

redis做延迟队列?

之前使用过redis的list做过延迟队列操作,是使用顺序读取,不满足延迟条件,从头插入list的操作,这样的话一次只能处理一条数据。 我们可以改成使用sort set 数据类型来做: 1:使用ZADD来添加任务,score 可以使用时间戳来填充,例如 currentTimestatmp +delay time 2:使用ZRANGEBYSCORE来获取 符合我们要求的时间段的任务 3:任务处理完成,使用ZREM 来清除已处理任务 ***实例代码:***来源gpt

import redis.clients.jedis.Jedis;

import java.time.Instant;
import java.util.Set;

public class DelayedQueueExample {
    public static void main(String[] args) {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // 添加延迟任务,延迟时间为 60 秒
            long delayTimeInSeconds = 60;
            long executeTime = Instant.now().getEpochSecond() + delayTimeInSeconds;
            jedis.zadd("delayQueue", executeTime, "task1");

            // 模拟处理延迟任务
            processDelayedTasks(jedis);
        }
    }

    private static void processDelayedTasks(Jedis jedis) {
        long currentTime = Instant.now().getEpochSecond();

        // 获取到期的任务
        Set<String> tasks = jedis.zrangeByScore("delayQueue", 0, currentTime);
        for (String task : tasks) {
            System.out.println("Processing: " + task);
            // 在这里处理任务逻辑

            // 从队列中移除已处理的任务
            jedis.zrem("delayQueue", task);
        }
    }
}

上面的第二步,需要使用定时任务来刷数据,如果需要持久化,请使用其他方式。