Redis延迟队列原理及实例
import time
import redis
# 连接Redis
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
def process_job(job):
print(f"处理任务: {job}")
# 模拟生产者将任务推送到延时队列
def bust_queue(queue_name, delay_seconds, job_data):
score = time.time() + delay_seconds
redis_client.zadd(queue_name, {job_data: score})
print(f"任务 {job_data} 已推送到延时队列 {queue_name}")
# 消费者循环从延时队列取任务
def process_delay_queue(queue_name, sleep_time):
while True:
# 使用 ZRANGEBYSCORE 获取当前分数(时间)及之前的所有任务
jobs = redis_client.zrangebyscore(queue_name, 0, time.time())
for job in jobs:
# 处理任务
process_job(job)
# 从延时队列移除已处理的任务
redis_client.zrem(queue_name, job)
time.sleep(sleep_time)
# 使用示例
delay_queue_name = "delay_queue"
job_data = "job1"
delay_seconds = 10
bust_queue(delay_queue_name, delay_seconds, job_data)
process_delay_queue(delay_queue_name, 1)
这段代码展示了如何使用Redis的有序集合(sorted set)来实现延时队列。生产者将任务以分数(代表将来执行任务的时间)加入到延时队列中,消费者循环检查并处理到期的任务。这里的处理方式是简单地打印出任务,实际应用中可以替换为任务处理逻辑。
评论已关闭