Redis服务器是一个事件驱动程序,服务器需要处理两类事件:

文件事件:

文件事件就是服务器对套接字(socket)操作的抽象,服务器和客户端的通信会产生文件事件

时间事件:

时间事件就是服务器对定时操作(比如serverCron函数)的抽象,Redis服务器中的一些操作需要在给定的时间点执行

一,文件事件

文件事件处理程序是基于Reactor的网络通信程序,是对套接字操作的抽象,每当套接字变成可应答、可读、可写的时候,相应的文件事件就会产生。

1.文件事件处理器的组成

1.1,套接字:

Socket

1.2,IO多路复用程序:

负责监听多个套接字,并向文件事件分派器传送产生了事件的套接字。

由于文件事件可能并发的出现,所以IO多路复用程序会把所有产生事件的套接字放到一个队列里,然后通过这个队列,以有序,同步,每次一个套接字的方式向文件事件分派器传送套接字。当上一个套接字产生的事件被处理完才传送下一个套接字

1.3,文件事件分派器:

接收IO多路复用程序传来的套接字,并根据套接字产生的事件的类型,调用相应的事件处理器

1.4,事件处理器:

处理器其实就是一个函数,它们定义了某个事件发生时,服务器应该执行的动作。服务器会为执行不同任务的套接字关联不同事件处理器

2,I/O多路复用程序的实现

Redis的I/O堵路复用程序的所有功能都是通过包装  select,epoll等I/O多路复用函数库来实现。每个I/O多路函数库在Redis源码中都对应一个单独的文件。

Redis程序会在编译时自动选择系统中性能最高的I/O多路复用函数库,来作为Redis的I/O多路复用程序的底层实现。

3,事件的类型

AE_READABLE事件:

  当客户端对套接字执行wirte操作,或执行close操作。此时套接字变得可读。

  当客户端对服务器监听的套接字执行connect操作。此时套接字变得可读。

AE_WRITEABLE事件:

  当客户端对套接字执行read操作,此时套接字变得可写。

I/O多路复用程序让服务器同时监听套接字的AE_READABLE事件和AE_WRITEABLE事件,如果一个套接字同时产生了这两种事件(只有非阻塞IO才能同时读写),文件事件处理器优先处理AE_READABLE事件,然后才处理AE_WRITEABLE事件。

4,API

5,文件事件的处理器

Redis为文件事件编写了多个处理器,这些事件处理器分别用来实现不同的网络通信需求:

5.1,连接应答处理器

accpetTcpHandler函数是Redis的连接应答处理器,用来对连接服务器的客户端进行应答。

当服务器进行初始化时,程序会将这个连接应答处理器和服务器监听套接字的AE_READABLE事件关联起来,当有客户端用connect函数连接服务器监听的套接字时,套接字就会产生AE_READABLE事件,引发连接应答处理器执行,并执行相应的套接字应答操作。

5.2,命令请求处理器

readQueryFromClient函数是Redis的命令请求处理器,用来接受客户端传来的命令请求。

当一个客户端通过连接应答处理器成功连接到服务器后,服务器会将客户端套接字的AE_READABLE事件和命令请求处理器关联起来,当客户端向服务器发送命令请求时,套接字产生AE_READABLE事件,引发命令请求处理器执行,并执行相应的套接字读入操作。

5.3,命令回复处理器

sendReplyToClient函数是Redis的命令回复处理器,这个处理器负责将服务器执行命令后得到的命令回复通过套接字返回给客户端。

当服务器有命令回复需要传送给客户端时,服务器会将客户端套接字的AE_WRITEABLE事件和命令回复处理器关联起来,当客户端准备好接收服务器传回的命令回复时,就会产生AE_WRITEABLE事件,引发命令回复处理器执行,并执行相应的套接字写入操作

转载于:https://www.cnblogs.com/inspred/p/10681687.html

《Redis设计与实现》之第十二章:事件的更多相关文章

  1. <构建之法>第十一章、十二章有感

    十一章:软件设计与实现 工作时要懂得平衡进度和质量.我一直有一个困扰:像我们团队这次做 男神女神配 社区交友网,我负责主页的设计及内容模块,有个队友负责网站的注册和登录模块,有个队友负责搜索模块,有个 ...

  2. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  3. [CSAPP笔记][第十二章并发编程]

    第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...

  4. perl5 第十二章 Perl5中的引用/指针

    第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用  子程序模板七.数组与子程序八.文件句 ...

  5. JavaScript DOM编程艺术-学习笔记(第十二章)

    第十二章 1.本章是综合前面章节的所有东西的,一个综合实例 2.流程:①项目简介:a.获取原始资料(包括文本.图片.音视频等) b.站点结构(文件目录结构) c.页面(文件)结构 ②设计(切图) ③c ...

  6. CSS3秘笈:第十二章&第十三章

    第十二章 1.网页布局类型 (1)固定宽度 (2)流式 (3)响应式Web设计 2.CSS布局的方法 通过给元素设置一个宽度,将它浮到左侧或右侧,就可以创建一个列(元素后面的文本会环绕浮动的元素,仿佛 ...

  7. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  8. Testlink1.9.17使用方法(第十二章 总结)

    第十二章 总结 QQ交流群:585499566 TestLink用于进行测试过程中的管理,通过使用TestLink提供的功能,我们可以将测试过程从:测试需求.测试设计.到测试执行.完整的管理起来,同时 ...

  9. 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

    进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...

  10. 20190925 On Java8 第二十二章 枚举

    第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法 ...

随机推荐

  1. H5的新特性

    https://blog.csdn.net/weixin_42441117/article/details/80705203 1.h5新语义元素(有利于代码可读性和SEO)2.本地存储    h5提供 ...

  2. ajax前端传递对象给后端

    前端操作如下即可:

  3. 1034 Head of a Gang (30分)(dfs 利用map)

    One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...

  4. PTA | 1020. 月饼 (25)

    月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时允许取出一部分库存.样 ...

  5. 「给产品经理讲JVM」:垃圾收集算法

    纠结的我,给我的JVM系列终于起了第三个名字,害,我真是太难了.从 JVM 到 每日五分钟,玩转 JVM 再到现在的给产品经理讲 JVM ,虽然内容为王,但是标题可以让更多的人看到我的文章,所以,历经 ...

  6. 关于微信小程序的一点经验

    2018年的11月份,自己做微信小程序相关的项目已经有四个月,这四个月自己走过很多弯路,也学到了不少经验,下面就一一总结: 一,微信小程序的radio组件是可以改变按钮样式的(比如大小,颜色等等) 改 ...

  7. MTK Android 回调机制[CallBack]

    具体步骤: 一.建模 回调函数的关键是:将一段代码作为参数传递,而这段代码将会在某个时刻被执行 我理解的接口回调就是,我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去 ...

  8. (js描述的)数据结构[集合结构](6)

    (js描述的)数据结构[集合结构](6) 一.集合结构特点 1.集合中的元素不能重复. 2.集合是无序的. 二.集合的代码实现 function Set() { this.items = {} //1 ...

  9. Linux基础篇,系统服务(service)的管理

    一.服务是什么? 用白话文说,服务就是"常驻在内存中的进程",用来提供一些系统或网络功能. 二.service和daemon的区别与联系 因为服务(service)本质上来说也是程 ...

  10. Git mergetool 插件

    首先你喜欢使用git命令行操作,可以上网下载Kdiff3安装到你的电脑,然后按下面的操作就可以使用这个工具了. 1. 安装Kdiff3 软件.(最好使用默认路径) 2. 添加kdiff3到git me ...