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

7、Redis队列Stream和单线程及多线程模型

一、Redis Stream 消息队列

核心数据结构:Rax树(基数树)
核心特性:消息持久化、消费者组、消息回溯

1. 生产者操作
命令示例说明
XADDXADD mystream * name mark age 18追加消息,*自动生成ID(格式:<毫秒时间戳>-<序号>
XDELXDEL mystream 1626705954593-0逻辑删除(设置标志位)
XRANGEXRANGE mystream - + COUNT 2查询消息(-最小ID,+最大ID)
XLENXLEN mystream获取消息数量(自动过滤已删除消息)
2. 独立消费者模式
# 阻塞读取最新消息(0表示无限等待)
XREAD BLOCK 0 STREAMS mystream $
# 从指定ID开始读取
XREAD COUNT 2 STREAMS mystream 1626705954593-0

特点:无需消费者组,类似List的简单消费模式

3. 消费者组模式
# 创建消费者组
XGROUP CREATE mystream mygroup 0-0
# 消费者读取消息
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >

关键机制

  • last_delivered_id:记录消费进度
  • PEL(Pending Entries List):已读取但未ACK的消息
  • 消息ACK:XACK mystream mygroup 1626705954593-0

二、Redis线程模型演进
1. Redis 6.0前单线程模型

核心架构:单Reactor模式

处理
处理
处理
单线程Reactor
IO多路复用器
epoll/kqueue
客户端请求
文件事件分派器
命令请求处理器
命令回复处理器
连接应答处理器
单线程执行
SET/GET等命令
异步线程
大Key删除
连接清理
脏数据回收

特点

  • 纯内存操作,瓶颈在网络I/O而非CPU
  • 异步线程处理:大Key删除、连接清理等
  • 单线程QPS极限:约10万(Pipeline可达100万)

为何坚持单线程

  • 避免锁竞争、上下文切换开销
  • 内存操作纳秒级完成,多线程收益有限
2. Redis 6.0多线程优化

配置参数

io-threads 4         # 启用4个I/O线程(建议为核心数50-70%)
io-threads-do-reads yes  # 开启读多线程

多线程流程

主线程
连接
接收响应
连接
接收响应
IO线程组
读取
写入
读取
写入
Socket数据
IO线程1
响应数据
IO线程2
Socket数据
响应数据
Socket存入等待队列
接收新连接
轮询分配Socket
给IO线程组
阻塞等待IO线程
完成读写
单线程执行命令
将响应写入队列
通知IO线程回写
客户端1
客户端1
客户端2
客户端2

线程分工

  • 主线程:连接管理、命令执行、任务分配
  • IO线程组:并行处理网络读写(read()/write()系统调用)

执行阶段
红色为单线程阶段

网络读
命令解析
内存操作
响应编码
网络写

性能提升

  • 单机QPS提升至20万+
  • 仅网络I/O多线程化,命令执行仍单线程(无并发安全问题)

三、关键对比与选型建议
特性Redis 5.0及以前Redis 6.0+
线程模型单线程Reactor多线程I/O + 单线程命令执行
适用场景10万QPS以下业务高并发热点访问(如热搜)
配置复杂度无需调优需合理设置io-threads参数
数据一致性天然强一致同左(命令执行仍单线程)

四、生产环境最佳实践
  1. Stream使用建议

    • 优先使用消费者组模式(支持ACK和故障恢复)
    • 监控PEL队列积压:XPENDING mystream mygroup
  2. 线程模型调优

    # 监控多线程性能
    redis-cli --stat
    # 查看线程状态
    redis-cli info threads
    
    • 建议值:io-threads = CPU核心数×0.7(如4核机器设为3)
  3. 规避大Key问题

    # 异步删除大Key(非阻塞主线程)
    UNLINK big_stream
    

通过合理使用Stream和线程模型优化,Redis可支撑百万级消息队列和高并发访问。核心原则:I/O密集型场景启用多线程(如秒杀、热搜),CPU密集型操作保持单线程(如大量Lua脚本执行)

http://www.xdnf.cn/news/1246627.html

相关文章:

  • Pandas query() 方法详解
  • SpringBoot3.x入门到精通系列:4.2 整合 Kafka 详解
  • 基于deepSeek的流式数据自动化规则清洗案例【数据治理领域AI带来的改变】
  • 2025-08-05Gitee + PicGo + Typora搭建免费图床
  • FPGA设计思想与验证方法学系列学习笔记003
  • springboot + maven 使用资源占位符实现动态加载配置文件
  • 【springcloud的配置文件不生效】
  • Linux 系统启动原理2
  • Occ3D: A Large-Scale 3D Occupancy Prediction Benchmark for Autonomous Driving
  • Unity开发者快速认识Unreal 的C++(四)Pawn和Actor
  • 智慧城市SaaS平台|市容环卫管理系统
  • Spring-rabbit使用实战六
  • Could not load the Qt platform plugin “xcb“ in “无法调试与显示Opencv
  • 类内部方法调用,自注入避免AOP失效
  • RK3568 Linux驱动学习——字符设备驱动开发
  • 森赛睿科技成为机器视觉产业联盟会员单位
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(六)
  • Vue.js 教程
  • css3属性总结和浏览器私有属性
  • Matplotlib(六)- 坐标轴定制
  • 【视觉识别】Ubuntu 22.04 上安装和配置 TigerVNC 鲁班猫V5
  • 技术与情感交织的一生 (十一)
  • 漏洞分析:90分钟安全革命
  • 原型模式在C++中的实现与面向对象设计原则
  • vue3 计算属性
  • 前端实现Excel文件的在线预览效果
  • 10-红黑树
  • LINUX 85 SHElL if else 前瞻 实例
  • Goby 漏洞安全通告| NestJS DevTools /inspector/graph/interact 命令执行漏洞(CVE-2025-54782)
  • 国内办公安全平台新标杆:iOA一体化办公安全解决方案