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

相关推荐
2401_8365631813 小时前
用Python读取和处理NASA公开API数据
jvm·数据库·python
2301_8187320613 小时前
项目启动报错,错误指向xml 已解决
xml·java·数据库·后端·springboot
Austindatabases13 小时前
<span class=“js_title_inner“>DBA 未来的是末日还是希望 -- 国外专家博主分析谈发展趋势 (翻译 分析)</span>
数据库·dba
难得的我们13 小时前
超越Python:下一步该学什么编程语言?
jvm·数据库·python
青衫码上行13 小时前
NoSql数据库简介 + Redis概述
数据库·redis·nosql
码农阿豪13 小时前
Oracle 到金仓数据库迁移实战:一次真正“落地”的国产替代之旅
java·数据库·oracle
TDengine (老段)14 小时前
通过云服务 快速体验 TDengine
大数据·数据库·物联网·时序数据库·tdengine·涛思数据·iotdb
惊讶的猫14 小时前
mysql多表查询
数据库·mysql
可涵不会debug14 小时前
Redis魔法学院——第四课:哈希(Hash)深度解析:Field-Value 层级结构、原子性操作与内部编码优化
数据库·redis·算法·缓存·哈希算法
学习不止,掉发不停14 小时前
MySQL基础-DQL(四)
数据库·mysql