Redis中如何实现分布式任务调度?

Redis 可以通过以下方式实现分布式任务调度:

  1. 使用有序集合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);  // 删除已执行任务
}
  1. 使用有序集合实现定时重复任务:
  • 每次任务执行完成后,不删除任务元素,而是使用 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); 
}