为什么Redis 6.0引入了多线程?

2 个回答

  • 张虎
    你要习惯任何人的忽冷忽然,也要看淡任何人的渐行渐远。
    ## 为什么引入多线程? 有很多同学就有疑问了,既然官方都表示CPU不是Redis的性能瓶颈,那么为什么还要引入多线程呢? 虽然单线程有很多优点,但对应的也必然会有一些缺点存在: - 只能使用CPU的单核 - 如果删除的key过大(set 里面有一堆key),会导致服务端阻塞(后面通过LazyFree机制) - QPS难以提高 但是redis并没有直接上多线程IO去处理这些,而是在多线程之前引入了LazyFree机制 ### 引入多线程的优点 - 充分利用CPU资源 - 多线程任务有利于分担Redis同步IO读写的负荷 ### LazyFree lazyFree 主要包括有:flushDb操作,flushall,berewriteaof,删除大key等操作,采用多线程去单独做这些事情,主线程只负责关系的解除,子线程在后台默默的异步执行这些耗时的操作。 ## 多线程模型 ![image.png](https://images.codewd.com/5741868551aeba5cad5553adeb2d8c10.jpg "image.png") - 主线程接收到客户端的连接请求,获取socket放入等待队列 - 主线程判断等待队列已满,则通过轮询的方式,将这些连接分配给线程组 - 主线程等待IO线程执行读取socket完毕 - IO线程读取socket完毕之后,主线程开始执行redis命令 - 将执行结果写入缓冲区 - 阻塞等待IO线程将数据写入socket - 等待IO线程写入完毕,主线程清空队列,解绑关系,等待后续的连接请求 ## redis多线程安全么? 安全的 一句话总结:多线程只用在了IO读写上面,redis命令执行还是单线程执行。
    编辑于 2025-07-03 09:14 •IP属地 北京
    举报
    评论
    收藏

  • 小洋
    纵然前路迷茫,纵然天隔一方,纵然我手中的刀刃已然破碎,也无法阻挡我寻找你的道路。
    ### **1. 背景** Redis 一直以单线程著称,依靠 **多路复用技术**(`epoll` + **事件驱动**),在单线程下也能实现 **80,000 - 100,000 QPS**。对于大多数场景,单线程 Redis 运行良好,但随着业务规模扩大,**超大流量场景下的 QPS 需求不断提升**,单线程架构开始出现瓶颈。 ### **2. Redis 单线程的瓶颈** ![image.png](https://images.codewd.com/e504ff5b0c7a3a09908e048686d5f653.jpg "image.png") Redis 主要的 **性能瓶颈在网络 IO 处理**,主要表现在: - **多路复用(select/poll/epoll)仍然是同步阻塞型 IO**,即使可以同时监听多个连接,处理仍然是 **单线程串行执行**。 - **CPU 资源浪费**,Redis 依赖 **高主频 CPU** 运行,但 **单线程架构无法利用多核 CPU** 的计算能力。 - **网络请求解析耗时**,每次 Redis 处理请求都需要 **解析命令、读取数据、返回结果**,**解析和 IO 开销占比很高**。 ### **3. Redis 6.0 多线程的改进** Redis 6.0 **引入多线程优化网络请求的处理**,其核心思路是: - **多个 IO 线程并行解析网络请求**,提高并发处理能力。 - **主线程仍然负责数据读写**,确保数据操作的原子性,避免线程安全问题。 - **网络 IO 线程负责读取数据后,交给主线程执行命令,最后再由 IO 线程返回结果**。 ### **4. Redis 6.0 的多线程模型** - **网络请求接收**:多个 IO 线程同时接收请求,解析请求数据。 - **主线程执行命令**:解析后的命令仍然由主线程执行,确保数据一致性。 - **返回结果**:多个 IO 线程并行发送响应,提高吞吐量。 ### **5. 为什么只对网络请求进行多线程优化?** 1. **避免数据竞争问题** - 如果读写操作采用多线程,多个线程可能会同时修改同一键值,带来线程同步问题。 - Redis 采用单线程执行命令,可以 **天然避免并发冲突**。 2. **网络 IO 处理占用大量 CPU** - 在 Redis 的性能分析中,**网络 IO 处理(请求解析、数据返回)占 CPU 50% 以上**,是主要的性能瓶颈。 - 采用多线程处理 **IO 解析**,让主线程专注数据操作,提高整体效率。 3. **单线程模型更简单** - Redis 追求极致的性能优化,单线程执行命令可以避免复杂的锁机制,降低维护成本。 - 通过多线程优化网络 IO,而不是改为全多线程,能够 **在提升性能的同时,保持简单可靠的架构**。 ### **6. Redis 6.0 多线程带来的提升** - **高并发场景下 QPS 提升**,Redis 6.0 在多核 CPU 服务器上的吞吐量比 5.0 版本 **提升 2 倍以上**。 - **网络 IO 处理速度加快**,请求解析和响应回写都变得更加高效。 - **降低 Redis 集群扩展需求**,在同等硬件条件下,**单节点 Redis 的处理能力更强**,减少了对 Redis 分片和集群的依赖。 ### **7. 总结** - **Redis 6.0 主要优化了网络请求的并行处理,使用多个 IO 线程解析请求,提高性能**。 - **核心数据读写仍然是单线程,避免数据竞争,保证 Redis 的高效和稳定**。 - **多线程主要解决网络 IO 瓶颈,充分利用多核 CPU 提升 Redis 吞吐量**,适用于 **高并发、大流量场景**。
    编辑于 2025-06-27 15:07 •IP属地 北京
    举报
    评论
    收藏