为什么说redis是单线程及redis执行过程

Redis以单线程模型运行,通过文件事件处理器处理IO多路复用,实现高并发。文件事件处理器包括多个socket、IO多路复用程序、文件分派器和事件处理器。在Redis 6.0版本中,引入了多线程来处理网络读写,以提升性能,但核心操作仍保持单线程以简化事务和并发控制。
摘要由CSDN通过智能技术生成

一.结论

 

        因为redis内部用的是文件事件处理器,文件事件处理器是单线程的,所以redis才叫单线程模型。

Redis采用IO多路复用机同时制监听多个socket,将产生事件的socket压入队列中,事件分派器根据socket上的事件类型选择对应的事件处理器进行处理。

二.文件时间处理器

包括以下4部分:

1.多个socket

2.IO多路复用程序

3.文件分派器

4.事件处理器

多个socket可能对并发产生不同的操作,每个操作对应不同的文件事件,IO多路复用程序会监听多个socket,将产生事件的socket压入队列中进行排队,事件分派器每次会从队列中取出一个socket,根据socket事件类型,交给相应的文件事件处理器进行处理。

三.Redis一次处理过程

 发送建立连接的请求(创建通信socket)

1.redis服务端初始化时,将server socket的AE_READABLE事件与连接应答处理器关联

2.客户端socket向Redis进程的server socket请求建立连接

3.此时产生一个AE_READABLE的事件

4.多路复用器监听到事件后,将socket压入队列排队

5.文件分派器从队列中取出socket1事件,并交给连接应答器处理,

6.连接应答器会创建一个与客户端通信的socket1,并将socket1的AE_READABLE事件与命令请求处理器建立关联

发送set/get请求

1.客户端发送一次请求 set/get

2.redis中的一个socket会产生一个AE_READABLE事件

3.IO多路复用,将socket压入队列排队

4.此时,事件分派器从队列中获取到socket的AE_READABLE事件,并交给命令请求处理器来处理

5.命令请求处理器读取socket的操作事件并在自己的内存中完成事件

6.操作完成后,会将此socket的AE_WRITABLE事件与命令回复器进行关联

返回结果

1.redis中的socket1产生一个AE_READABLE事件,

2.将socket1压入队列

3.事件分派器将事件交给命令回复器处理

4.返回执行结果

5.解除socket1事件AE_WRITABLE与命令回复器的关联

下图可以帮助理解:(更详细的内容,可以参考《Redis设计与实现》-- 黄健宏 第二部分第12章节内容)

四.Redis6.0版本

6.0版本开始引入多线程版本,随着业务的发展,说明redis的单线程在某些方面已经不具备优势。因为网络读写的系统调用,在redis占用的大部分CPU的时间,所以把网络读写做成多线程的方式会有很大的性能提升,比如keyDB。

Redis多线程部分只是用来处理网络读写,执行操作部分扔是单线程。之所以不用多线程,是因为多线程复杂,并且需要处理控制事务,网络并发等。

参考书籍:

《Redis设计与实现》-- 黄健宏

强烈推荐redis书籍:《Redis设计与实现》-- 黄健宏 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值