Redis线程模型

Redis为什么这么快

  1. Redis完全**基于内存**,内存的访问效率比硬盘快很多
  2. 执行命令为**单线程**,避免竞争状态下的线程切换造成资源浪费
  3. 基于**非阻塞的IO多路复用机制**
  4. **C语言编写**,并且内部采用的数据结构经过**反复优化**

单Reactor单线程模型

  1. 服务端是**单线程处理业务**,本质上处理业务的是 **同步IO阻塞**的模型
  2. 会有大量的时间在阻塞环境,阻塞在 listen-socket中的accept中,或是阻塞在 read 或是write操作中

image.png

通过引入IO多路复用模型

  1. 在引入**IO多路复用模型**后,Reactor通过 **epoll****listen-socket**进行监听,如果epoll监听到 **listen-socket**已经就绪,说明发生了连接事件,**产生事件后放入队列**,由**文件事件分发器**发送到对应的**连接应答处理器**进行处理,同时**连接应答处理器返回client-socket**
  2. 在建立连接产生 client-socket后,也会被加入到epoll所监听,如果epoll监听到client-socket已经准备就绪,则说明发生了指令请求事件,产生事件后放入队列,由文件事件分发器发送到指令请求处理器进行处理,同时通过指令回复处理器通过 client-socket进行信息的回复。

image.png

  1. 如果是listen-socket 监听到准备就绪,则会生成AE_READABLE事件
  2. 如果是client-socket 监听到准备就绪,则会根据语句类型而生成 AE_READABLE和AE_WRITEABLE事件

image.png

为什么Redis6.0前使用单线程

  1. 在4.0后即引入多线程,除了主线程以外,还有后台线程在执行一些较为耗时的操作,例如删除无用的key,清理大Key等操作
  2. Redis的**瓶颈不在于Cpu**中,而在于**网络的IO**,引入**多线程需要考虑很多的问题**,而且在多线程情况下,在**线程切换之间也会耗费很多的资源**
  3. Redis是完全基于内存的,并且是纯KV操作,Redis可以理解为是一个大型的HashMap,因此除了时间复杂度为O(n)的操作,**操作非常快**

为什么Redis6.0之后使用多线程

Redis主要的瓶颈在于**网络的IO**,因此可以利用**多线程对IO进行优化**

  1. 使用线程组**优化从socket读取信息的过程**
  2. 从socket读取到的信息需要**解析请求**,可以使用线程组优化
  3. 在主线程处理完数据后,需要**通过socket进行数据的回写**,IO过程可以使用优化

image.png
image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值