Redis(④-消息队列削峰)

消息队列削峰是分布式系统中应对突发流量冲击 的一种重要策略,核心目的是平滑流量波动,保护后端服务不被瞬间高并发压垮

想象你开了一家奶茶店,平时每小时接待 100 个客人(后端服务正常处理能力)。但某天突然来了 500 个客人同时排队(突发流量),如果让所有人同时涌向吧台(直接请求后端),吧台会因为忙不过来而混乱(服务崩溃)。

这时候,你可以让客人先取号排队(进入消息队列),吧台按顺序一个一个处理(消费消息),哪怕外面排了很多人,吧台内始终按自己的节奏处理(100 个 / 小时),避免了瞬间拥挤 ------ 这就是 "削峰"。

用 Python 脚本批量入队(模拟峰值)

producer.py

python 复制代码
import redis
import time

# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
queue_name = "order_queue"

# 模拟秒杀峰值:1秒内产生1000个订单请求
start_time = time.time()
for i in range(1000):
    order_id = f"order_{i + 1}"
    # 入队(左侧添加)
    r.lpush(queue_name, order_id)
    if i % 100 == 0:
        print(f"已发送 {i + 1} 个订单请求")

end_time = time.time()
print(f"峰值流量模拟完成,共发送1000个请求,耗时:{end_time - start_time:.2f}秒")
print(f"当前队列长度:{r.llen(queue_name)}")  # 查看队列中的消息数

模拟 "匀速消费"(消费者处理消息)

consumer.py

python 复制代码
import redis
import time

# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
queue_name = "order_queue"
process_capacity = 100  # 系统每秒处理能力:100个订单

print(f"开始处理订单,每秒处理 {process_capacity} 个...")
processed = 0  # 已处理数量

while True:
    # 出队(右侧取出,FIFO 先进先出)
    # RPOP 会阻塞吗?不会,没有消息时返回None
    order_id = r.rpop(queue_name)
    
    if order_id:
        # 模拟处理订单(实际中这里是业务逻辑)
        processed += 1
        print(f"处理订单:{order_id.decode()},已处理:{processed}")
        
        # 控制处理速度:每处理100个,暂停1秒(匹配系统能力)
        if processed % process_capacity == 0:
            time.sleep(1)
    else:
        # 队列空了,退出
        print("所有订单处理完成!")
        break

核心 Redis 命令解析

命令 作用 对应场景
LPUSH key value 向列表左侧添加消息(入队) 生产者发送消息
RPOP key 从列表右侧取出消息(出队) 消费者处理消息
LLEN key 查看列表长度(当前消息数) 监控队列堆积情况

通过这个例子可以看到,Redis 消息队列就像一个 "缓冲池",把突发的 "尖峰流量" 转化为平缓的 "匀速流量",这就是 "削峰" 的核心逻辑。

相关推荐
冉冰学姐9 分钟前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly16 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客24 分钟前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.28 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐32 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_999934 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学1 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.1 小时前
Mysql
数据库·mysql
fengxin_rou1 小时前
[Redis从零到精通|第四篇]:缓存穿透、雪崩、击穿
java·redis·缓存·mybatis·idea·多线程
全栈前端老曹2 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集