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);
}
}
}
上面的第二步,需要使用定时任务来刷数据,如果需要持久化,请使用其他方式。