码迷,mamicode.com
首页 > 编程语言 > 详细

Redis线程模型

时间:2020-02-08 15:40:02      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:开发   队列   客户   相关   分布式锁   建立   分配   style   ima   

原文:Redis线程模型

  Redis基于Reactor模式开发了自己的网络事件处理器。被称为文件事件处理器,由于这个处理器是单线程的所以决定了redis是单线程的。

 

  Redis线程模型的组成:

      1. 多个socket  
      2. IO多路复用程序
      3. scocket队列
      4. 文件事件分配器
      5. 事件处理器(连接应答处理器,命令请求处理器,命令回复处理器) 

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

 

  技术图片

 

   Redis线程模型的流程及原理

    如下图客户端和redis的一次通信:

    技术图片

 

     1、客户端socket01请求redis的server scoket建立连接,此时server socket生成AE_READABLE事件,IO多路复用程序监听到server socket产生的事件,并将该事件压入队列。

  文件事件分派器从队列中拉取事件交给连接应答处理器,处理器同时生成一个与客户端通信的socket01,并将该scoket01的AE_READABLE事件与命令请求处理器关联

    2、此时客户端scoket01发送一个set key value的请求,redis的scoket01接收到AE_READABLE事件,IO多路复用程序监听到事件,将事件压入队列,文件分派器取到事件,由于scoket01已经

  和命令请求处理器关联,所以命令请求处理器开始set key value,完毕后会将redis的scoket01的AE_WAITABLE事件关联到命令回复处理器

    3、如果此时客户端准备好接收返回结果了,向redis中的socket01发起询问请求,那么 redis 中的 socket01 会产生一个 AE_WRITABLE 事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ok,之后解除 socket01 的 AE_WRITABLE 事件与命令回复处理器的关联。

    这样便完成了redis的一次通信。

 

  通过上述线程模型讲述,进一步了解redis中的事务,之前说事务和命令都是一组最小的执行单元,事务应该是该客户端将一组命令发送给redis,redis将一组命令压入队列,命令请求处理器一起处理

不会中断。

  在redis实现分布式锁时说过,会发生并发问题,当客户端A执行1,2操作,客户端B执行3,4操作,并发执行时,在redis中的队列状况可能是  1,3,4,2  / 3,4,1,2 等多种情况,所以会引起并发问题。

Redis线程模型

标签:开发   队列   客户   相关   分布式锁   建立   分配   style   ima   

原文地址:https://www.cnblogs.com/lonelyxmas/p/12283360.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!