当前位置: 首页 > news >正文

Redis(④-消息队列削峰)

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

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

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

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

producer.py

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

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 会阻塞吗?不会,没有消息时返回Noneorder_id = r.rpop(queue_name)if order_id:# 模拟处理订单(实际中这里是业务逻辑)processed += 1print(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 消息队列就像一个 “缓冲池”,把突发的 “尖峰流量” 转化为平缓的 “匀速流量”,这就是 “削峰” 的核心逻辑。

http://www.dtcms.com/a/320656.html

相关文章:

  • 使用OAK相机实现智能物料检测与ABB机械臂抓取
  • 《Hive、HBase、StarRocks、MySQL、OceanBase 全面对比:架构、优缺点与使用场景详解》
  • Numpy科学计算与数据分析:Numpy数据分析与图像处理入门
  • [激光原理与应用-182]:测量仪器 - 光束型 - 光束质量分析仪
  • 无人机航拍数据集|第9期 无人机风力电机表面损伤目标检测YOLO数据集2995张yolov11/yolov8/yolov5可训练
  • WORD接受修订,并修改修订后文字的颜色
  • 2-等级保护
  • LabVIEW多循环架构
  • (已解决)IDEA突然无法使用Git功能
  • 利用千眼狼sCMOS相机开展冷离子云成像与测量实验
  • Mac上安装和配置MySQL(使用Homebrew安装MySQL 8.0)
  • LeetCode 面试经典 150_数组/字符串_加油站(14_134_C++_中等)(贪心算法)
  • OpenBMC Entity Manager 深度解析:架构、原理与应用实践
  • 【优选算法】多源BFS
  • C#调用Unity实现设备仿真开发
  • Java+uniapp+websocket实现实时聊天,并保存聊天记录
  • (nice!!!)(LeetCode 每日一题) 808. 分汤 (深度优先搜索dfs)
  • Latex中公式部分输入正体的字母\mathrm{c}
  • [激光原理与应用-183]:测量仪器 - 光束型 - 光束参数乘积(BPP)的本质与含义,聚焦能力与传输稳定性的物理矛盾。
  • 汽车零部件深孔加工质控升级:新启航激光频率梳 3D 测量解决传统光学扫描遮挡
  • Linux网络--2、Socket编程
  • 力扣-238.除自身以外数组的乘积
  • 《Leetcode》-面试题-hot100-链表
  • 力扣热题100------287.寻找重复数
  • 大语言模型提示工程与应用:提示词基础使用方式
  • 9.2 通过DuEDrawingControl把eDrawing嵌入到C#中显示
  • windows线程基础
  • leetcode热题——有效的括号
  • FPS游戏准心跳动效果实现指南
  • 为什么通过CreateThread创建的线程调用C/C++运行库函数不稳定