Redis 可以通过以下方式实现分布式任务调度:
- 使用有序集合sorted set实现简单任务调度:
- 将任务执行时间作为元素的分数,任务ID作为元素的成员。
- 每次取出分数最小的元素,即最早需要执行的任务,并执行对应的任务逻辑。
- 任务执行完成后,使用 ZREM 命令删除已执行任务元素。
例如:
Jedis jedis = new Jedis("localhost");
// 添加任务,以1小时后的时间戳作为分数
jedis.zadd("task_queue", System.currentTimeMillis() + 3600, "task1");
while (true) {
// 获取分数最小的任务
Set<String> tasks = jedis.zrangeByScore("task_queue", 0, System.currentTimeMillis(), 0, 1);
if (tasks.isEmpty()) continue;
String taskId = tasks.iterator().next();
// 执行任务逻辑
jedis.zrem("task_queue", taskId); // 删除已执行任务
}
- 使用有序集合实现定时重复任务:
- 每次任务执行完成后,不删除任务元素,而是使用 ZADD 命令更新其分数为下次执行时间。
- 这样就可以实现定时重复执行的任务调度。
例如:
// 添加一个每30秒执行一次的任务
jedis.zadd("task_queue", System.currentTimeMillis() + 30000, "task1");
while (true) {
// 获取分数最小的任务并执行
String taskId = jedis.zrangeByScore("task_queue", 0, System.currentTimeMillis(), 0, 1).get(0);
// 执行任务逻辑
// 更新任务的分数为下次执行时间
jedis.zadd("task_queue", System.currentTimeMillis() + 30000, taskId);
}