Redis 本身不直接支持延迟队列,但可以通过 ZSET 数据结构模拟实现。你可以将任务作为成员添加到 ZSET 中,并将执行时间作为分数。通过定时轮询 Redis,你可以检查并移除已经到期的任务。
以下是一个简单的 Python 示例,使用 Redis ZSET 来实现延迟队列:
import time
import redis
连接到Redis
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
添加任务到延迟队列
def add_to_delay_queue(queue_name, task_id, delay_seconds):
score = time.time() + delay_seconds
redis_client.zadd(queue_name, {task_id: score})
处理延迟队列中的任务
def process_delay_queue(queue_name):
while True:
取当前最早要执行的任务
tasks = redis_client.zrangebyscore(queue_name, 0, time.time())
for task_id in tasks:
print(f"Processing task: {task_id}")
执行任务...
移除已经处理的任务
redis_client.zrem(queue_name, task_id)
time.sleep(1) # 每秒检查一次
使用示例
delay_queue_name = 'delay_queue'
task_id = 'task1'
delay_seconds = 10
添加任务到延迟队列
add_to_delay_queue(delay_queue_name, task_id, delay_seconds)
启动处理延迟队列的线程或进程
process_delay_queue_thread = threading.Thread(target=process_delay_queue, args=(delay_queue_name,))
process_delay_queue_thread.start()
在这个示例中,add_to_delay_queue 函数将任务添加到 ZSET 中,其中分数是任务应该被处理的时间(当前时间加上延迟秒数)。process_delay_queue 函数会无限循环地检查队列,并处理那些其时间分数小于或等于当前时间的任务。这个简单的实现不包括异常处理、重试逻辑或分布式锁,但足以展示如何使用 Redis ZSET 来实现基本的延迟队列。