Redis队列Demo带你体验任务处理效率提升的奇妙开始,简单又实用
- 问答
- 2026-01-14 17:13:48
- 3
(引用来源:基于Redis官方文档对列表(List)数据结构的说明,以及常见任务队列的实现模式)
你有没有遇到过这种情况:你的网站或应用有一个功能,比如用户上传头像后需要生成不同尺寸的缩略图,或者用户下单后需要立刻发送一封确认邮件,这些任务如果放在用户点击按钮的那个请求里一起完成,用户就得眼睁睁地等着,直到所有事情都做完才能看到结果,万一生成缩略图很慢,或者邮件服务器暂时抽风,那用户可能就直接关掉页面走人了,体验非常差。
这时候,一个叫做“队列”的东西就能派上大用场,你可以把它想象成现实生活中排队买奶茶,顾客(用户请求)点完单付了钱(主要业务逻辑完成),店员会给他一张小票(任务凭证),然后顾客就可以先去旁边坐着玩手机了,不用堵在柜台前,后厨(任务处理器)会根据小票的顺序,一杯一杯地做奶茶(处理任务),做好了再叫号,这样,柜台接待的速度就非常快,不会因为做奶茶慢而影响后续的顾客。
Redis,这个速度超快的内存数据库,它里面有一种叫“列表”的结构,特别适合用来实现这种“奶茶店排队”模式,也就是消息队列,下面我就用一个最简单的Demo,带你亲手搭一个队列,感受一下它是怎么让任务处理变得“丝滑”的。

第一幕:准备“柜台”和“后厨”(环境搭建)
你得安装好Redis并启动它,这就好比租下了一个店铺,通了电,我们需要两个角色:
- 生产者: 就像柜台点单的店员,它负责接收用户请求,把需要处理的任务变成一个消息,然后放进Redis的队列里。
- 消费者: 就像后厨做奶茶的师傅,它不停地盯着Redis里的队列,一有新的任务进来,就取出来埋头处理。
在这个Demo里,我们用Python语言来模拟这两个角色,因为它简单易懂,你需要安装Python的Redis客户端库,比如redis-py,在命令行里输入pip install redis就能安装。

第二幕:柜台开始营业——生产者投递任务
我们先来写“柜台”(生产者)的代码:
import redis
import time
import json
# 连接到本地的Redis服务器,就像店员走到了柜台前
r = redis.Redis(host='localhost', port=6379, db=0)
# 假设这是我们要处理的任务,比如生成缩略图的任务信息
task_list = [
{'user_id': 101, 'image_url': 'http://example.com/photo1.jpg'},
{'user_id': 102, 'image_url': 'http://example.com/photo2.jpg'},
{'user_id': 103, 'image_url': 'http://example.com/photo3.jpg'},
]
# 柜台开始接待顾客,把每个任务依次放入名为 'task_queue' 的队列
for task in task_list:
# 将任务字典转换成JSON字符串,方便存储和传递
task_data = json.dumps(task)
# 关键一步:使用 lpush (left push) 将任务从列表左边推入队列
r.lpush('task_queue', task_data)
print(f"已投递任务:{task}")
# 模拟一下任务不是同时来的,间隔1秒
time.sleep(1)
print("所有任务投递完毕!")
这段代码运行后,三个任务就像三张点单小票,被依次放进了Redis中一个叫task_queue的列表里,柜台的工作瞬间就完成了,非常快。

第三幕:后厨开工——消费者处理任务
“后厨”(消费者)要开始干活了,我们再写一个Python脚本:
import redis
import json
import time
# 后厨也连接到同一个Redis
r = redis.Redis(host='localhost', port=6379, db=0)
print("后厨(消费者)开始等待任务...")
# 后厨需要一直工作,所以是个无限循环
while True:
# 关键一步:使用 brpop (blocking right pop) 从队列右边取出一个任务
# 这里的 'task_queue' 是队列名,0 代表如果没有任务就无限期阻塞等待,不会白耗CPU
queue_name, task_data = r.brpop('task_queue', 0)
# 取到任务了!
task = json.loads(task_data) # 把JSON字符串还原成字典
print(f"捞到一个新任务:为用户 {task['user_id']} 处理图片 {task['image_url']}")
# 模拟一个耗时的任务处理过程,比如生成缩略图需要3秒钟
print("正在努力生成缩略图...")
time.sleep(3)
print(f"任务完成!用户 {task['user_id']} 的图片已处理妥当,\n")
运行这个消费者脚本,你会看到,它立刻从队列里取出了第一个任务,然后开始“处理”(也就是sleep 3秒),在这3秒里,你可以想象,即使有新的用户请求到来,生产者也能飞快地把新任务塞进队列,而不会被正在处理的慢任务卡住,消费者处理完一个,会自动去队列里取下一个,如果队列是空的,它就会安安静静地等着。
奇妙之处在哪里?
你会发现,生产者和消费者是完全分开的,各干各的:
- 效率提升: 用户(生产者端)的体验变好了,因为他的请求瞬间就得到了响应(任务已投递),无需等待。
- 解耦: 柜台(生产者)和后厨(消费者)互不干扰,即使后厨今天手艺生疏(处理任务慢),或者暂时歇业(消费者程序重启),柜台依然可以正常收单,把任务先存起来,等后厨恢复了,再继续处理积压的任务。
- 伸缩性: 如果生意太好,一个后厨忙不过来怎么办?太简单了!你只需要多开几个消费者脚本(多雇几个厨师),他们都会自动地从同一个队列里抢任务来做,这就是所谓的“多个消费者竞争同一个队列”,处理能力瞬间提升。
这个Demo虽然简单,只是用了Redis的基本列表操作LPUSH和BRPOP,但它清晰地展示了队列的核心思想——异步处理,它把“立刻要做的事”和“可以稍后做的事”分开,用空间(队列)换取了时间(响应速度),当你下次再遇到需要提升响应速度、化解系统瓶颈的场景时,不妨想想这个Redis队列Demo,它可能就是那个奇妙开始的起点,你可以基于这个基础,去实现更复杂的任务,比如发送邮件、清理数据、分析日志等等,让程序的世界也变得井然有序。
本文由革姣丽于2026-01-14发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/80666.html
