大家好,我是程序员二叉。
简介
Redis 之所以能实现超高并发、低延迟,核心依赖 IO 多路复用模型;Redis 6.0 引入多线程进一步提升性能;Pipeline 与 Lua 脚本是批量优化、原子操作的关键方案。本文一次性讲透epoll 原理、Redis 6.0 多线程、Pipeline、Lua 脚本,面试+生产必备。欢迎点赞收藏关注。
一、Redis 多路复用 IO 模型 & epoll 原理
1. 核心作用
Redis 单线程能支撑10W+ QPS,最大功臣就是 IO 多路复用。
- 单线程处理命令,无锁竞争
- IO 多路复用监听大量客户端连接
- 只有连接产生读写事件时才处理,非阻塞、高性能
2. IO 多路复用是什么
一个线程同时监听多个 socket 连接的读写事件,哪个就绪就处理哪个,避免为每个连接创建独立线程。
3. epoll 核心原理(Linux 默认实现)
- 事件驱动:只监听活跃事件,不轮询全部连接
- 回调通知:连接就绪时内核主动通知,无需遍历
- 水平触发:未处理完的事件会持续通知
- 内核态缓存:减少用户态与内核态的数据拷贝
- 支持百万级连接,时间复杂度O(1)
4. Redis 使用流程
- epoll 管理所有客户端
socket - 主线程阻塞等待事件就绪
- 事件触发 → 读取命令 → 单线程执行 → 返回结果
- 全程无阻塞、无锁竞争,效率最大化
二、Redis 6.0 多线程机制
1. 核心结论(面试必背)
命令执行仍然是单线程,网络处理变为多线程!
2. 多线程负责什么
- 多线程处理:网络 IO
- 读取客户端数据(协议解析、解码)
- 回写响应数据到客户端
- 单线程处理:命令执行
- 所有读写命令(get/set/hset 等)
- 保证原子性、无锁、无并发安全问题
3. 为什么这么设计
- 命令执行是内存操作,速度极快
- 网络 IO 才是性能瓶颈
- 多线程加速网络读写,又不破坏单线程安全
4. 开启方式(默认关闭)
io-threads-do-reads yes io-threads 4三、Pipeline 管道作用、原理、适用场景
1. 核心作用
批量执行命令,减少网络往返次数 RTT,大幅提升批量操作性能。
2. 原理
- 客户端将多条命令打包,一次性发送给 Redis
- Redis 批量执行所有命令
- 一次性批量返回结果
- N 次网络 IO → 1 次网络 IO
3. 优点
- 极大降低网络开销
- 性能提升10~100 倍
- 客户端实现,Redis 无感知
4. 注意点
- 不保证原子性
- 命令过多会占用大量内存
- 适合无依赖关系的批量操作
5. 适用场景
- 批量插入大量数据
- 批量获取多个 key
- 对原子性无要求的批量读写
四、Lua 脚本作用、原子性、批量操作
1. 核心作用
在 Redis 中实现原子性、事务性、复杂批量逻辑,替代传统事务。
2. 原理
- 编写 Lua 脚本 → 发送给 Redis
- Redis单线程原子执行
- 执行期间不插入任何其他命令,保证绝对原子性
3. 核心优势
- 原子性:脚本执行过程不被打断
- 减少网络 IO:一次请求执行复杂逻辑
- 可复用:脚本可缓存重复使用
- 功能强:支持条件判断、循环、计算
4. 常用场景
- 分布式锁解锁
- 限流(计数器 + 过期)
- 库存扣减、抢单逻辑
- 多命令批量原子操作
5. 执行命令
EVAL "脚本内容" key数量 key1 key2 ... arg1 arg2五、总结(面试必背)
- IO 多路复用:
epoll事件驱动,单线程支撑海量连接,是 Redis 高性能基石。 - Redis 6.0 多线程:网络处理多线程,命令执行单线程,提升 IO 效率且不破坏安全。
- Pipeline:打包命令批量发送,减少网络往返,性能极高,但不保证原子性。
- Lua 脚本:原子执行、减少 IO、逻辑强大,适合分布式锁、限流、库存等业务。