二、redis线程模型

二、redis线程模型

1. Redis是单线程吗?

Redis的单线程指的是「接收客户端请求->解析请求->进行数据读写->发送数据给客户端」,这个过程是由一个线程(主线程)来完成的,也就是我们常说redis是单线程的原因

但是redis程序并不是单线程的,redis在启动的时候,是会自动启动后台线程的:

  • redis在老版本,会启动两个后台线程,分别处理关闭文件、AOF刷盘的操作
  • redis在相对新一点的版本,新增了后台进程,用来异步释放redis内存,也就是lazyfree,会把一些删除操作交给后台线程来执行,不会导致redis主线程卡顿。因此当我们要删除一个大key的时候,不要用del命令删除,因为del是主线程在处理的,这样会导致redis主线程卡顿,应该使用unlink来处理

之所以redis为「关闭文件、AOF刷盘、释放内存」这些任务创建单独的线程来处理,因为这些任务都是很耗时的,如果把这些任务都放在主线程来处理,那么redis主线程就很容易发生阻塞,这样就无法处理后续的请求了。

后台线程相当于一个消费者,生产者把耗时的任务丢到任务队列中,消费者不停轮训这个队列,拿出任务就去执行对应的方法

image-20221207232611977

2. Redis单线程模式是怎么样的?

image-20221207232647048

这个地方太细节了,未来再看详细看看

3. Redis采用单线程为什么还这么快

官方使用基准测试的结果是,单线程Redis吞吐量可以达到10WQPS,如下图:

image-20221207233512385

之所以redis采用单线程那么快,有以下几个原因:

  1. Redis大部分操作都在内存中完成,数据结构高效。redis瓶颈是机器的内存或者网络带宽,而不是CPU;
  2. 避免了多线程之间的竞争,省去了多线程切换带来的开销,也不会导致死锁问题;
  3. 采用I/O多路复用机制处理大量客户端的请求,简单来说,redis只运行单线程的情况下,该机制允许内核中同时存在多个监听socket和已连接socket,内核一旦监听到socket上的连接请求或数据请求,一旦到达就交给redis线程处理;

image-20221207234038463

4. redis6.0之前为什么使用单线程

单线程的程序,是无法利用服务器多核CPU的,早起Redis版本的主要工作(网络I/O和执行命令)为什么还要用单线程呢?

核心意思是:

CPU并不是制约Redis性能表现的瓶颈所在

引入多线程增加了系统的复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗

5. Redis6.0之后为什么引入了多线程?

在Redis6.0版本后,也采用了多个I/O线程来处理网络请求,这是因为随着网络硬件的性能提升,redis性能瓶颈有时候会出现在网络I/O处理上,为了提高网络I/O的并行度,redis6.0对于网络I/O采用多线程来处理

但是对于命令的执行,redis仍然使用单线程来处理

官方表示,redis6.0版本引入的多线程I/O特性对性能提升至少是一倍以上;


二、redis线程模型
http://example.com/2022/11/23/develop/redis/二、Redis线程模型/
作者
Curious;
发布于
2022年11月23日
许可协议