Redis线程模型

Redis它是基于Reactor模式来实现事件处理器。那Redis线程模型包括四个部分:

  • 客户端Socket
  • IO多路复用模型。可以实现一个线程监听多个Socket的事件
  • 事件分派器。根据Socket中不同的事件来选择不同的事件处理器来执行
  • 事件处理器。用来解析相应的事件,并调用方法去处理事件

那它的一个执行流程是这样的,客户端通过Socket连上Redis服务器,然后服务端就使用IO多路复用模型来监听客户端的Socket,如果客户端比如说产生了一个命令请求,那么Socket就会产生对应的事件,被IO多路复用模型监听到,然后会被统一放入一个队列中,这个就好比生产者消费者模型嘛。事件分配器从队列中拿到socket进行消费,按照事件的不同类型分发给不同的事件处理器,在事件处理器中才是真正地去处理命令,处理完之后通过Socket进行回复。

Redis的事件处理器有很多种,可以对应客户端多种不同的事件:

  • 连接响应处理器。在Redis服务器初始化的时候,这个处理器会与服务端Socket上的AE_READABLE事件进行绑定。后续如果有客户端连接到服务端上,服务端Socket就会产生这个AE_READABLE事件,然后连接响应处理器就会执行对应的逻辑
  • 命令请求处理器。当客户端连接上服务端时,客户端Socket的AE_READABLE事件就会与命令请求处理器绑定。(刚才那个是服务端Socket的AE_READABLE,这个是客户端上的,有所区别)当客户端发出命令请求的时候,就会产生该事件,然后对应的命令请求处理器就会被触发。
  • 命令回复处理器。顾名思义是用来回复的嘛。当服务端处理完请求,有信息需要回复时,Socket上的AE_WRITABLE事件就会与命令回复处理器绑定,当客户端准备好接受命令后,就会产生该事件,对应的处理器就会执行了。

这个就是Redis线程模型的一些内容。

Q:为什么Redis是单线程的还如此高效?

  • Redis使用了IO多路复用模型。一个线程可以监听多个IO事件,或者说是Socket。相比于传统BIO模型种一个线程只能对应一个IO事件。这样的多路复用模型更加高效合理
  • 不考虑持久化机制的话,Redis是完全基于内存操作,所以性能比Mysql这样需要进行磁盘IO的数据库来说,表现更好。实际上Redis持久化是调用fork函数创建出一个子进程,然后使用CopyOnWrite的算法来完成,也就是请求处理和持久化的进行是分离的。
  • 单线程避免了线程切换的开销嘛。因为线程切换设计操作系统上用户态到核心态的转化,这也是一个重量级操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值