Java 实现 Redis 延迟队列:高效处理定时任务
Redis 延迟队列是指将任务先存储在 Redis 中,然后根据任务的执行时间,在指定的延迟时间后再执行任务。常见的应用场景包括定时任务、消息通知等。
实现 Redis 延迟队列的步骤如下:
-
将任务存储到 Redis 中,采用有序集合(Sorted Set)来存储,以任务的执行时间作为 score,任务内容作为 value。
-
启动一个单独的线程或进程,不断从 Redis 中取出已到期的任务,并执行任务。
-
在执行任务时,需要先将任务从有序集合中删除,避免重复执行。
-
可以考虑使用 Redis 的 Lua 脚本来实现删除和执行任务的原子性操作。
下面是一个基于 Redis 和 Java 的延迟队列实现示例:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.ZParams;
import java.util.Set;
public class RedisDelayQueue {
private static final String QUEUE_NAME = 'delay_queue';
private static final int BATCH_SIZE = 100;
private JedisPool jedisPool;
public RedisDelayQueue(String host, int port) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(1000);
config.setMaxIdle(100);
config.setMinIdle(10);
this.jedisPool = new JedisPool(config, host, port);
}
public void addTask(String task, long delay) {
try (Jedis jedis = jedisPool.getResource()) {
long timestamp = System.currentTimeMillis() + delay;
jedis.zadd(QUEUE_NAME, timestamp, task);
}
}
public void start() {
new Thread(() -> {
while (true) {
try (Jedis jedis = jedisPool.getResource()) {
long now = System.currentTimeMillis();
Set<String> tasks = jedis.zrangeByScore(QUEUE_NAME, 0, now, 0, BATCH_SIZE);
if (tasks.isEmpty()) {
Thread.sleep(1000);
continue;
}
Transaction tx = jedis.multi();
for (String task : tasks) {
tx.zrem(QUEUE_NAME, task);
tx.exec();
System.out.println('Executing task: ' + task);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public static void main(String[] args) {
RedisDelayQueue delayQueue = new RedisDelayQueue('localhost', 6379);
delayQueue.addTask('task1', 5000);
delayQueue.addTask('task2', 10000);
delayQueue.start();
}
}
上述代码中,addTask 方法将任务存储到 Redis 的有序集合中,start 方法启动一个线程从 Redis 中取出已到期的任务并执行。具体实现中,我们使用 zrangeByScore 方法从有序集合中获取 score 在指定范围内的任务,使用 multi 方法开启事务,从有序集合中删除任务并执行。注意,这里需要使用 ZParams.limit 方法限制一次性取出的任务数量,避免一次性取出太多任务导致阻塞 Redis。
通过使用 Redis 延迟队列,可以有效地管理和执行定时任务,提高应用的效率和可靠性。
原文地址: https://www.cveoy.top/t/topic/oXYv 著作权归作者所有。请勿转载和采集!