Redis单线程
Redis所谓的单线程并不是所有工作都是只有一个线程在执行,而是指Redis的网络IO和键值对读写是由一个线程来完成的。
Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理。
如下图所示:
图片
Redis 的核心网络模型一直是一个典型的单 Reactor 模型,利用 epoll/select/kqueue 等多路复用技术,在单线程的事件循环中不断去处理事件。
可以看出Redis对CPU计算力的要求并不迫切,相反单线程机制让 Redis 内部实现的复杂度大大降低,同时降低了因为上下文切换和资源竞争造成的性能损耗。
Redis 6.0多线程
以上便是 Redis 的核心网络模型,这个单线程网络模型一直到 Redis v6.0 才改造成多线程模式。
那既然单线程这么好用,为什么Redis 6.0要引入多线程模式?
很简单,就是 Redis 的网络 I/O 瓶颈已经越来越明显了。
Redis 最初选择单线程网络模型的理由是,CPU 通常不会成为性能瓶颈,因此单线程足够了。
但是,近年来底层网络硬件性能越来越好,Redis 的性能瓶颈逐渐体现在网络 I/O 的读写上,单个线程处理网络 I/O 读写的速度跟不上底层网络硬件执行的速度。
图片
Redis 使用了单线程的 I/O 模型,主要负责处理客户端请求和执行命令,这意味着 Redis 在处理 I/O 操作时是阻塞的,当有大量的客户端连接时,可能会导致性能瓶颈。
既然读写网络的 read/write 系统调用占用了Redis 执行期间大部分CPU 时间,那么要想真正做到提速,必须改善网络IO性能。
所以,Redis6.0 版本之后,Redis 正式在核心网络模型中引入了多线程,也就是所谓的 I/O threading,至此 Redis 真正拥有了多线程模型。
图片
Redis 6.0 引入了多线程 I/O 模型,这是为了更好地利用多核 CPU 和提高 I/O 操作的并发性能。
虽然主线程仍然是单线程的,但在处理网络事件和文件 I/O 操作时,Redis 使用了多个辅助线程来分担负载。
Redis多线程模型总结
Redis 从 Redis 6.0 开始引入了多线程 I/O 模型,以提高在处理网络事件和文件 I/O 操作时的性能和并发能力。
多线程 I/O 模型允许 Redis 更好地利用多核 CPU,通过多个辅助线程来分担负载,提高了并发性能。
主线程仍然是单线程的,但后台工作线程用于执行 I/O 操作,例如处理客户端连接、数据读写以及持久化操作。
总的来说,Redis 的多线程设计主要用于优化 I/O 操作和提高并发性能,而主要的命令处理仍然由单个线程负责,以确保数据的一致性。
这个设计使得 Redis 在大多数情况下能够以极高的性能和低延迟响应请求,特别适用于缓存、消息队列和数据存储等用途。