当前位置: 首页 > 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.dtcms.com/a/315960.html

相关文章:

  • 二手房翻新时怎样装修省钱?
  • STM32H7+FreeRTOS+LwIP移植EtherCAT开源主站SOEM
  • 【AI论文】iLRM:一种迭代式大型3D重建模型
  • 3D 材质与纹理:让虚拟模型 “以假乱真” 的核心密码
  • Linux内核C语言代码规范
  • 解决IntelliJ IDEA 项目名称后带中括号问题(模块名不一致)
  • OpenGL状态机与对象管理:优化图形渲染的高效方法
  • 支持在电脑桌面悬挂的便利贴工具好用评测
  • LeetCode 面试经典 150_数组/字符串_H 指数(9_274_C++_中等)(排序后再进行判断)(计数)
  • 应用科普 | 漫谈6G通信的未来
  • Vue中使用步骤条Steps-手写简单的步骤条功能
  • 大模型下一个飞跃?OpenAI的“新突破”:通用验证器
  • FANCU发那科机器人双脉冲焊接省气
  • 解决英飞凌Tricore编译软件Tasking加载过慢编译卡死问题
  • Windows驱动更新下载工具,电脑硬件设备驱动程序自动安装下载更新,可备份还原!键盘鼠标声卡网卡显卡主板硬盘驱动都可以下载,免费使用的神器!
  • 从传统架构到创新安全:Web2.0与Web3.0的比较分析
  • 10-红黑树
  • Python--JSON格式
  • 艺术性与真实感并存:FLUX.1 Krea [dev] 开源模型速览
  • 复杂环境跌倒识别准确率↑31%!陌讯多模态算法在智慧养老的落地实践
  • 嵌入式硬件中运放内部底层分析
  • Java、Android及计算机基础面试题总结
  • Salesforce Hub-Spoke 架构介绍
  • LoRa基站和网关的区别
  • C++-特殊类设计
  • 学习游戏制作记录(将各种属性应用于战斗以及实体的死亡)8.5
  • 生物医药科研革命:深度解析协同实验记录如何重塑新药研发全流程
  • 应急响应实验复现
  • 浅谈 NUMA 与 MySQL
  • MySQL 在麒麟系统上部署使用 + DBeaver 远程连接 + SQL 数据导入完整流程