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 消息队列就像一个 "缓冲池",把突发的 "尖峰流量" 转化为平缓的 "匀速流量",这就是 "削峰" 的核心逻辑。

相关推荐
马克Markorg3 小时前
常见的向量数据库和具有向量数据库能力的数据库
数据库
Coder_Boy_5 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy5 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道7 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_12498707537 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha7 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_7 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance7 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋8 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.8 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库