深入理解 Redis 的文件事件处理器

news2024/11/14 15:21:16

概述

Redis 的文件事件处理器是基于 Reactor 模式实现的,内部采用 IO 多路复用程序来同时监听多个套接字,当被监听的套接字准备好执行连接应答(accept)读取(read)写入(write)关闭(close)等操作时,与操作相对应的文件事件就会产生,此时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

核心组件

文件事件处理器主要由以下4个核心组件构成:

  • 套接字(Sockets):服务器与客户端之间的通信端点;
  • I/O 多路复用程序:负责同时监听多个套接字,并在套接字准备好执行操作时通知文件事件分派器;
  • 文件事件分派器(Dispatcher):接收 I/O 多路复用程序传来的事件,并根据事件类型调用相应的事件处理器;
  • 事件处理器:定义了在特定事件发生时,服务器应该执行的动作。
    文件事件处理器

IO多路复用程序

Redis 的 IO 多路复用程序是通过包装常见的selectepollevportkqueue 这些 I/O 多路复用函数库来实现的, 每个 I/O 多路复用函数库在 Redis 源码中都对应一个单独的文件。
因为Redis 为每个 I/O 多路复用函数库都实现了相同的 API , 所以 I/O 多路复用程序的底层实现是可以互换的。
在这里插入图片描述

事件类型

在 Redis 中,文件事件主要分为两大类:

  • 当套接字变得可读时(客户端对套接字执行 write 操作 或 close 操作),或者有新的可应答(acceptable)套接字出现时(客户端对服务器的监听套接字执行 connect 操作),套接字将产生AE_READABLE 事件;

  • 当套接字变得可写时(客户端对套接字执行 read 操作),套接字将产生 AE_WRITEABLE 事件。

事件处理器

为了实现不同的网络通信需求,Redis 为文件事件编写了多个处理器。

连接应答处理器

当 Redis 服务器初始化时,会将连接应答处理器与服务器监听套接字的AE_WRITEABLE事件关联起来;

当客户端用 connect 函数连接到服务器时,服务器的监听套接字会产生 AE_READABLE 事件;

此时,连接应答处理器会被触发,它负责接受客户端的连接请求,并创建客户端套接字。随后,服务器会将客户端套接字的 AE_READABLE 事件与命令请求处理器关联,以便接收客户端发送的命令请求。

命令请求处理器

当客户端向服务器发送命令请求时,客户端套接字会产生AE_READABLE事件,引发命令请求处理器执行,并执行相应的套接字读入操作;

命令回复处理器

当服务器准备好回复数据给客户端时,它会将客户端套接字的 AE_WRITABLE 事件与命令回复处理器关联。当客户端准备好接收数据时,套接字会产生 AE_WRITABLE 事件,触发命令回复处理器执行,将命令回复写入套接字。

当命令回复发送完毕后,服务器就会解除命令回复处理器与客户端套接字的AE_WRITABLE事件的关联。

完整的连接示例

  1. 假设一个 redis 服务器正在运行,那么服务器监听套接字的AE_READABLE事件就处于监听状态下,并与连接应答处理器关联;
  2. 此时有一个客户端向服务器发起连接,服务器监听套接字将产生AE_READABLE事件,触发连接应答处理器执行,对客户端的连接请求进行应答;然后会创建客户端套接字,并将客户端套接字的AE_READABLE事件与命令请求处理器关联;
  3. 客户端向服务器发送命令请求,客户端套接字将产生AE_READABLE事件,触发命令请求处理器执行,处理器读取客户端的命令,传给相关程序去执行;
  4. 服务器将客户端套接字的AE_WRITABLE事件与命令回复处理器关联,当客户端尝试读取命令回复时,客户端套接字将产生AE_WRITABLE事件,触发命令回复处理器执行,当命令回复处理器将命令回复全部写入到套接字后,服务器就会解除客户端套接字的AE_WRITABLE 事件与命令回复处理器之间的关联。

一次完整的交互流程

总结

Redis 的文件事件处理器是其高性能网络通信的核心。通过单线程的事件驱动模型,Redis 能够有效地处理大量的并发连接和请求,同时保持了代码的简洁性和可维护性。

参考资料
《redis 设计与实现》

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

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

相关文章

计算机毕业设计 高校大学生竞赛项目管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

获取Live2d模型

文章目录 1、 Live2D官方示例数据集(可免费下载)2、模之屋3、unity商店4、直接b站搜索5、youtube6、BOOTH完结 1、 Live2D官方示例数据集(可免费下载) 官方提供了一些 Live2D实例模型给大家下载使用 地址:https://ww…

2024年【山东省安全员B证】报名考试及山东省安全员B证最新解析

题库来源:安全生产模拟考试一点通公众号小程序 山东省安全员B证报名考试是安全生产模拟考试一点通生成的,山东省安全员B证证模拟考试题库是根据山东省安全员B证最新版教材汇编出山东省安全员B证仿真模拟考试。2024年【山东省安全员B证】报名考试及山东省…

通用接口开放平台设计与实现——(31)API服务线程安全问题确认与修复

背景 在本系列的前面一篇博客评论中,有小伙伴指出,API服务存在线程安全问题: https://blog.csdn.net/seawaving/article/details/122905199#comments_34477405 今天来确认下,线程是否安全?如不安全,如何…

在k8s中,客户端访问服务的链路流程,ingress--->service--->deployment--->pod--->container

ingress是一个API资源。 其核心作用是nginx网页服务器。 当客户端访问服务器不同的url时, 用不同的location提供服务。 在k8s之外,nginx的配置一般如下: http {server {listen 80;server_name localhost;location / {root html; …

文件的应用实例

目录 1、拷贝文件 2、遍历文件夹 1、拷贝文件 说明:将一张图片/一首歌拷贝到另外一个目录下,要求使用read()和write()原生方法完成 """思路分析:1、打开源文件(需要拷贝的文件),读取源文件的数据2、打开目标文…

网络安全学习(四)渗透工具msf

本文简要介绍metasploit framework,是一款渗透工具。官网地址:Metasploit | Penetration Testing Software, Pen Testing Security | Metasploit msf是一个框架,可以加载各种模块,这是它的最强大之处。 kali中有此工具。 点击即…

python中的各类比较与计算

运算符 1.算数运算符2.关系运算符3.逻辑运算符4.关于短路求值5.赋值运算符1)的使用链式赋值多元赋值 2)复合赋值运算符 6.位运算符7.成员运算符8.身份运算符 1.算数运算符 # 加 print(1 2) # 减 print(2 - 1) # 乘 print(1 * 2) # 余数 4%31余数为1 print(4 % 3…

C++第五十一弹---IO流实战:高效文件读写与格式化输出

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1. C语言的输入与输出 2. 流是什么 3. CIO流 3.1 C标准IO流 3.2 C文件IO流 3.2.1 以写方式打开文件 3.2.1 以读方式打开文件 4 stringstre…

【测试方案】软件测试管理规程(doc源文件)

软件测试规程的作用在于确保软件测试活动的系统性、规范性和一致性。它明确了测试的目标、范围、方法、流程以及所需资源,为测试人员提供了明确的指导和操作规范。通过遵循测试规程,可以提高测试效率,减少测试遗漏和错误,保证软件…

NC 表达式求值

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 请写一个整数…

MySQL8.0.13-函数索引

目录 什么是函数索引 语法 函数索引测试 创建表结构 插入数据 创建普通索引 查看执行计划 创建函数索引 查看执行计划 查看索引信息 函数索引效率 普通索引 函数索引 分析 注意事项 老版本如何实现函数索引 什么是函数索引 本篇主要介绍 MySQL 的函数索引&…

【数据结构】顺序表和链表经典题目

系列文章目录 单链表 动态顺序表实现通讯录 顺序表 文章目录 系列文章目录前言一、顺序表经典例题1. 移除元素2. 合并两个有序数组 二、链表经典例题1. 移除链表元素2. 反转链表3. 合并两个有序链表4. 链表的中间节点5. 环形链表的约瑟夫问题 总结 前言 我们通过前面对顺序表…

NVM(node.js版本工具)的使用

1.nvm是什么 NVM 是 Node Version Manager 的缩写,它是一个用于管理 Node.js 版本的命令行工具。通过NVM,你可以在同一台机器上安装和切换多个 Node.js 版本,对于开发和测试在不同 Node.js 版本上运行的应用程序非常有用。 2.下载 下载之前…

『功能项目』眩晕图标显示【52】

我们打开上一篇51调整Boss技能bug的项目, 本章要做的事情是在释放法师的眩晕技能时,boss01处在眩晕动画时显示一个眩晕图标 首先双击Boss01预制体进入预制体空间 创建一个Image重命名为StateUIdiz 代表第一个受击状态 设置Canavas 并且修改Canvas的渲染…

Java 学习全攻略:从入门到精通的详细指南

目录 一、引言 Java 的背景和发展 学习 Java 的意义 二、Java 的核心特性 1. 面向对象编程(OOP) 2. 跨平台性 3. 自动内存管理 4. 强大的标准库 三、Java 基础语法 1. 变量和数据类型 原始数据类型 引用数据类型 2. 运算符 3. 控制结构 条…

柳淘鸿黄金沁透发热面膜:肌肤逆龄之旅的秘密武器!

柳淘鸿黄金沁透发热面膜:肌肤逆龄之旅的秘密武器!"柳淘鸿的黄金沁透发热面膜液融合了中国发明专利,专利号:ZL202310228041.5对应成分:胶原, 金,珍珠粉以及多种珍贵植物萃取精华,是肌肤逆龄之旅的绝密武器。这款面膜液温和滋养…

Git之误执行git rm -r解决方案(六十七)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

视频分割操作教程

1、打开剪映 2、点击开始创作上面的“”,选择视频,点击添加按钮,导入一个视频素材到剪映 3、滑动视频,让视频竖线到合适位置 4、点击视频,出现白色边框 5、点击工具栏“分割”,然后点击需要删除的视频部分 …

03 战略的本质与实践 - 战略管理实践的启示

1,战略有一定复杂性。在学术界就有很多学派。明斯伯格,加拿大的管理学家,认为有10大学派。 我看来有三个方面: 理性学派:通过规划、主动管理 演进学派:根据一个不确定性的环境,自发自下而上来形成 过程管理:重要的不是结果,而是过程 简单的看,如下图。 显示公司自己的…