Redis线程IO模型
谨记:redis是个单线程程序。直到6.0版本,才出现多线程。
一、为什么之前,是单线程的?
- redis作为成熟的分布式框架,它由很多模块组成:
网络请求模块
索引模块
存储模块
高可用集群模块
数据操作模块
- 通常所说的单线程指的是:网络IO和键值对读写是由一个线程完成的
为什么这两个模块不用多线程?
因为没必要。
解释:
多线程的目的:提高I/O利用率和CPU利用率。
下面,从I/O利用率和CPU利用率两方面证明其不必要行。
(1)redis的操作是基于内存的,CPU的资源根本不是性能瓶颈。因此,通过多线程提高CPU利用率是不必要的。
(2)redis有着大量的网络I/O和磁盘I/O,需要提高I/O利用率。但是,这并不是只有多线程一条路可以走,其采用了多路复用I/O技术。
同时,单线程的优点:
(3)单线程维护性更高,开发,调试,运维成本低。
(4)单线程避免了线程切换带来的开销
二、多路复用
本质:同步阻塞型IO模型
1.Linux 多路复用技术:
多个进程的 IO 可以注册到同一个管道上,这个管道会统一和内核进行交互。
当管道中的某一个请求需要的数据准备好之后,进程再把对应的数据拷贝到用户空间中。

IO 多路复用在 Linux 下包括了三种,select、poll、epoll,抽象来看,他们功能是类似的,但具体细节各有不同。
2.redis的多路复用
每个 IO 多路复用函数库在 Redis 源码中都有对应的一个单独的文件。
在 Redis 中,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。
因为一个服务器通常会连接多个套接字,所以多个文件事件有可能会并发地出现。

一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。
二、为什么之后是多线程?(6.0版本)
注意:6.0版本的多线程,只针对网络请求数据;数据的读写命令依然是单线程。
1.单线程的效率已经很高了,为什么还需要多线程?
因为:追求更高的效率,之前10万的QPS,对于大公司已经不够用了,要提升QPS.
2.瓶颈在哪?

上图可知:在多路复用的 IO 模型中,在处理网络请求时,调用 select (其他函数同理)的过程是阻塞的,也就是说这个过程会阻塞线程,如果并发量很高,此处可能会成为瓶颈。
所以:采用多线程处理IO请求。
3.为啥读写数据不能是多线程?
为了保证线程安全性。

浙公网安备 33010602011771号