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

redis的线程模型

时间:2018-10-30 00:29:58      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:str   取出   能力   程序   nbsp   个学生   命令   初始化   文件   

  当客户端与ServerSocket产生连接时,会产生一个 AE_REABLE / AE_WRITABL 事件, 多个Socket可能并发产生不同的事件,IO多路复用程序会监听这些Socket,按照顺序将这些Socket放到队列中排队。然后每次从队列中取出一个Socket来进行相应的操作。

技术分享图片

 *IO多路复用:这里有一个很好的例子,我就直接复制过来不做任何修改。原文链接:https://www.zhihu.com/question/28594409?sort=created

下面举一个例子,模拟一个tcp服务器处理30个客户socket。
假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:
  1. 第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C、D。。。这中间如果有一个学生
   卡主,全班都会被耽误。这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。
  2. 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个
用户创建一个进程或者线程处理连接。
  3. 第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下
去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。 这种就是IO复用模型。

 *文件事件处理器:

  如果是客户端要连接redis,那么会为socket关联连接应答处理器
  如果是客户端要写数据到redis,那么会为socket关联命令请求处理器
  如果是客户端要从redis读数据,那么会为socket关联命令回复处理器

*客户端与redis通信的一次流程:

  在redis启动初始化的时候,redis会将连接应答处理器跟AE_READABLE事件关联起来,接着如果一个客户端跟redis发起连接,此时会产生一个AE_READABLE事件,然后由连接应答处理器来处理跟客户端建立连接,创建客户端对应的socket,同时将这个socket的AE_READABLE事件跟命令请求处理器关联起来。

  当客户端向redis发起请求的时候(不管是读请求还是写请求,都一样),首先就会在socket产生一个AE_READABLE事件,然后由对应的命令请求处理器来处理。这个命令请求处理器就会从socket中读取请求相关数据,然后进行执行和处理。接着redis这边准备好了给客户端的响应数据之后,就会将socket的AE_WRITABLE事件跟命令回复处理器关联起来,当客户端这边准备好读取响应数据时,就会在socket上产生一个AE_WRITABLE事件,会由对应的命令回复处理器来处理,就是将准备好的响应数据写入socket,供客户端来读取。

  命令回复处理器写完之后,就会删除这个socket的AE_WRITABLE事件和命令回复处理器的关联关系。

*为啥redis单线程模型也能效率这么高?

1)简介的命令表达式
2)纯内存操作
3)核心是基于非阻塞的IO多路复用机制
4)单线程反而避免了多线程的频繁上下文切换问题

redis的线程模型

标签:str   取出   能力   程序   nbsp   个学生   命令   初始化   文件   

原文地址:https://www.cnblogs.com/wlwl/p/9874044.html

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