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 可以注册到同一个管道上,这个管道会统一和内核进行交互。
当管道中的某一个请求需要的数据准备好之后,进程再把对应的数据拷贝到用户空间中。

image

IO 多路复用在 Linux 下包括了三种,select、poll、epoll,抽象来看,他们功能是类似的,但具体细节各有不同。

2.redis的多路复用

每个 IO 多路复用函数库在 Redis 源码中都有对应的一个单独的文件。

在 Redis 中,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。

因为一个服务器通常会连接多个套接字,所以多个文件事件有可能会并发地出现。

image

一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。

二、为什么之后是多线程?(6.0版本)

注意:6.0版本的多线程,只针对网络请求数据;数据的读写命令依然是单线程。

1.单线程的效率已经很高了,为什么还需要多线程?

因为:追求更高的效率,之前10万的QPS,对于大公司已经不够用了,要提升QPS.

2.瓶颈在哪?

image

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

3.为啥读写数据不能是多线程?

为了保证线程安全性。

posted @ 2021-09-20 17:08  '蜗牛'  阅读(222)  评论(0)    收藏  举报