Redis中的事件(一)

事件

概述

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

  • 1.文件事件(file event):Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象。服务器与客户端(或者其他服务器)的通信会产生相应的文件事件,而服务器
    则通过监听并处理这些事件来完成一系列网络通信操作
  • 2.时间事件(time event):Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象

文件事件

Redis基于Reactor模式开发了自己的网络事件处理器:这个处理器被称为文件事件处理器(file event handler):

  • 1.文件事件处理器使用I/O多路复用(multiplexing)程序l来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器
  • 2.当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件处理器就会调用套接字之前关联好的事件处理器来处理这些事件
    虽然文件事件处理器以但单线程方式运行,但通过使用I/O多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与Redis服务器中其他以单线程方式运行的模块进行对接,这保持了Redis内部单线程设计的简单性

文件事件处理器的构成.

在这里插入图片描述

图中展示了文件事件处理器的四个组成部分,它们分别是套接字、IO多路复用程序、文件事件分派器(dispatcher),以及事件处理器。
文件事件是对套接字操作的抽象,每当一个套接字准备好执行连接应答(accept)、写入、读取、关闭等操作时,就会产生一个文件事件。因为一个服务器通常会连接多个套接字,所以多个文件事件可能会并发地出现。
IO多路复用程序负责监听多个套接字并向文件事件分派器传送那些产生了事件的套接字。尽管多个文件事件可能会并发地出现,但IO多路复用程序总是会将所有产生事件地套接字放入到一个队列里面,然后通过这个队列,以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向我呢见事件分派器传送套接字。当上一个套接字产生的事件被
处理完毕之后(该套接字为事件所关联的事件处理器执行完毕),IO多路复用程序才会继续向文件事件分派器传送下要给套接字。
在这里插入图片描述
文件事件分派器接收IO多路复用程序传来的套接字,并根据套接字产生的事件的类型,调用相应的事件处理器。服务器会为执行不同任务的套接字关联不同的事件处理器,这些处理器是一个个函数,它们定义了某个事件发生时,服务器应该执行的动作。

IO多路复用程序的实现

在这里插入图片描述

Redis的IO多路复用程序的所有功能都是都是通过包装常见的select、epoll、evport和kqueue这些IO多路复用函数库来实现的,每个IO多路复用函数库在Redis源码中都对应一个单独的文件,比如ae_select.c、ae_epoll.c、ae_kqueue.c,诸如此类。因为Redis为每个IO多路复用函数库都实现了相同的API,所以IO多路复用程序的底层实现是可以互换的。
如图所示。Redis在IO多路复用程序的实现源码中用#include宏定义了相应的规则,程序会在编译时自动选择系统中性能最高的IO多路复用函数库来作为Redis的IO多路复用程序的底层实现:

/*Include the best multiplexing layer suported by this system.
* The follwing should be ordered by performance,descending
*/
# ifdef HAVE_EVPORT
# include "ae_evport.c"
# else# ifdef HAVE_EPOLL# include "ae_epoll,c"# else# ifdef HAVE_KQUEUE# include "ae_kqueue.c"# else# include "ae_select.c"# endif# endif
# endif

事件的类型。

IO多路复用程序可以监听多个套接字的ae.h/AE_READABLE事件和ae.h/AE_WRITABLE事件,这两类事件和套接字操作之间的对应关系如下:

  • 1.当套接字变得可读时(客户端对套接字执行write操作,或者执行close操作)或者有新的可应答(acceptable)套接字出现时(客户端对服务器的监听套接字执行connect操作),套接字产生READABLE事件
  • 2.当套接字变得可写时(客户端对套接字执行read操作),套接字产生AE_WRITABLE事件。IO多路复用程序允许服务器同时监听套接字的AE_READABLE事件和AE_WRITABLE事件,如果一个套接字
    同时产生了这两种事件,那么文件事件分派器会优先处理AE_READABLE事件,等到AE_READABLE事件处理完之后,才处理AE_WRITABLE事件。也就是说,如果一个套接字又可读又可写的话,那么服务器将优先读套接字后写套接字

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2905612.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

map与set容器常见操作详解(含示例代码及注意事项)

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

QT布局管理和空间提升为和空间间隔

QHBoxLayout:按照水平方向从左到右布局; QVBoxLayout:按照竖直方向从上到下布局; QGridLayout:在一个网格中进行布局,类似于HTML的table; 基本布局管理类包括:QBoxLayout、QGridL…

CXL事务层(续)

3.2 CXL.cache 3.2.1 概览 CXL.cache协议将设备和主机之间的交互定义为多个请求,每个请求至少有一条相关的响应消息,有时还有数据传输。该接口在每个方向上由三个通道组成:请求(Request)、响应(Response&…

【Qt】:多种方式编辑hello world

多种方式编辑hello world 一.QLabel二.对象树三.使用单行编辑框四.使用按钮 (小技巧:1.可以使用F4来进行头文件和对应cpp文件的切换;2.写完一个函数的声名之后,按下altenter,就可以自动的在对应的cpp 文件中添加函数的定义了.) 一.QLabel 注意这里是QSt…

Codeforces Round 937 (Div. 4)

A. Stair, Peak, or Neither?&#xff08;模拟&#xff09; #include<iostream> using namespace std;int main(){int t;scanf("%d", &t);int a, b, c;while(t--){scanf("%d%d%d", &a, &b, &c);if(a < b && b < c) p…

windows 下用使用api OCI_ConnectionCreate连接oracle报错 TNS:无法解析指定的连接标识符

背景&#xff0c;两台服务器系统一样&#xff0c;oracle版本一样&#xff0c;其中一台服务器在运行程序的时候报错 TNS:无法解析指定的连接标识符 但是PL/SQL可以正常连接&#xff0c;怀疑是oracle配置文件的原因 tnsnames.ora配置文件大概作用&#xff1a;是Oracle客户端的网…

学习JavaEE的日子 Day32 线程池

Day32 线程池 1.引入 一个线程完成一项任务所需时间为&#xff1a; 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 2.为什么需要线程池(重要) 线程池技术正是关注如何缩短或调整Time1和Time3的时间&#xff0c;从而提高程序的性能。项目中可以把Time…

MT9256 Android 智能电视解决方案

一、方案描述 智能电视&#xff0c;是基于Internet应用技术&#xff0c;具备开放式操作系统与芯片&#xff0c;拥有开放式应用平台&#xff0c;可实现双向人机交互功能&#xff0c;集影音、娱乐、数据等多种功能于一体&#xff0c;以满足用户多样化和个性化需求的电视产品。有…

Kubernetes(K8S)学习(三):K8S实战案例

K8S实战案例 一、部署wordpressmysql&#xff08;NodePort方式&#xff09;&#xff08;1&#xff09;创建命名空间&#xff1a;wordpress&#xff08;2&#xff09;创建wordpress-db.yaml文件&#xff08;mysql&#xff09;&#xff08;3&#xff09;创建pod&#xff1a;mysql…

初识PySide6/PyQt6:基础简介及环境的安装配置与使用(一)

文章目录 一、基础简介二、PySide 6/PyQt 6具有的特性三、PySide 6/PyQt 6之间的区别四、搭建PyQt 6 环境4.1 安装PyQt64.2 测试PyQt6环境4.3 pycharm 配置Qt Designer、PyUIC 五、Qt Designer使用&#xff08;基础开发流程实操&#xff09;六、官方文档 一、基础简介 PySide …

基于单片机病房呼叫系统数码管显示房号设计

**单片机设计介绍&#xff0c;基于单片机病房呼叫系统数码管显示房号设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机病房呼叫系统数码管显示房号设计概要主要涵盖了利用单片机技术实现病房呼叫系统&#xff0c;并…

5.6 物联网RK3399项目开发实录-Android开发之U-Boot 编译及使用(wulianjishu666)

物联网入门到项目实干案例下载&#xff1a; https://pan.baidu.com/s/1fHRxXBqRKTPvXKFOQsP80Q?pwdh5ug --------------------------------------------------------------------------------------------------------------------------------- U-Boot 使用 前言 RK U-B…

修改nuxtjs项目中的浏览器图标步骤

处理步骤&#xff1a; 打开配置页面 使用el-upload 上传图片到后台 后台把图片转为ico&#xff0c;返回图标路径 配置页面修改本页面预览图&#xff0c;点击保存&#xff0c;修改的数据库。 通知nuxt布局页面&#xff0c;修改head节点中的图标属性&#xff0c;…

单链表算法库

singlelist.cpp #include "singlelist.h"/************************************************** ①函数名: CreatList_Head 功 能: 头插法建立单链表 参 数: (1)LinkList *&L: 传入的单链表指针地址(2)ElemType Array_used[]:要用来建表的数组(3)int Array_nu…

考研数学|高效刷透汤家凤《1800》经验分享

当然不需要换老师&#xff0c;如果你在基础阶段连汤老师的课都听不进去&#xff0c;那么换其他老师的话&#xff0c;很大可能也是白搭。 如果你现在对于1800还是一筹莫展的话&#xff0c;那么很明显&#xff0c;这反映出前期基础不扎实&#xff0c;没有真正理解和掌握这部分内…

WhatsApp被封如何解封?附账号防封技巧

相信各位小伙伴已经发现&#xff0c;WhatsApp新一轮风控已经启动&#xff0c;不少小伙伴已经受到封号潮的冲击。无论是老号还是新号都难以幸免。为了防止WhatsApp客户数据和聊天信息的丢失&#xff0c;针对封号的防封攻略请收藏&#xff01; 一、WhatsApp被封的8个原因 1、被过…

解决PATH变量污染的问题

文章目录 解决PATH变量污染的问题概述笔记清空PATH变量之后的系统设置在命令行查看清空后的PATH变量以 gitea-1.17.1-gogit-windows-4.0-amd64.exe 为例以系统命令 where为例备注 - 批处理的后缀最好是batEND 解决PATH变量污染的问题 概述 随着不断安装新软件, 可能多个软件中…

Facebook账号防封方法及解禁方法

Facebook作为跨境主要业务平台&#xff0c;一直以来封号率都非常高。相信点进来的各位或多或少地遇见了个人号被封&#xff0c;广告账户被禁&#xff0c;FB主页被封等情况。针对此类问题&#xff0c;今天就小编也来分享自己的Facebook防封经验。 一、Facebook被封原因 主要有以…

Win10 搭建FTP存储服务器站点【超详细教程】

目录 第一步&#xff1a;打开控制面板>程序 第二步&#xff1a;win10左下角搜索IIS并打开 第三步&#xff1a;右键网站&#xff0c;选择添加FTP站点 第四步&#xff1a;添加FTP站点名称 第五步&#xff1a;添加IP地址和端口 第六步&#xff1a;身份验证与授权信息 第…

八大技术趋势案例(人工智能物联网)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…