首页 > 数据库 >深入理解 Redis 的文件事件处理器

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

时间:2024-09-11 15:21:42浏览次数:10  
标签:AE Redis 文件事件 处理器 服务器 接字 事件 客户端

概述

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 设计与实现》

标签:AE,Redis,文件事件,处理器,服务器,接字,事件,客户端
From: https://blog.csdn.net/yqq962464/article/details/142138092

相关文章

  • Springboot 配置redis
    @ConfigurationpublicclassRedisConfig{@Value("${spring.data.redis.host}")privateStringredisHost;@Value("${spring.data.redis.port}")privateintredisPort;@Bean(name="jedisConnectionFactory")......
  • redis的雪崩、击穿和穿透
    redis是一种缓存工具,可以大大减少对数据库访问时数据库的压力,同时也可以让我们在对数据的读取时更方便,但由于某些因素,redis也可能会存在雪崩、击穿和穿透的风险:(引用自https://blog.csdn.net/wangxuanyang_zer/article/details/134420084)1、雪崩:是指在某一时间内大量的缓存失效或......
  • redis的持久化机制
    在使用Redis过程中,持久化是一项非常重要的功能,因为如果RedisServer停止工作,所有的数据将全部丢失。为了避免这种情况的出现,我们需要将Redis中的数据保存在硬盘上,以保证数据不受服务器宕机影响。Redis提供了两种持久化方式——RDB和AOF。一、什么是RDBRedis的RDB持久化方式......
  • Redis事务和管道
    Redis事务和管道事务一、概念Redis事务是可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入。 单独的隔离操作:Redis事务仅仅是保证事务里的操作会被连续独占地执行,redis命令执行是单线程架构,在执行完事务......
  • 食物垃圾处理器设计
    本设计依据我国实际情况,研制适合本国的厨房食物垃圾预处理装置——食物垃圾处理器。垃圾处理器的驱动电机和粉碎刀盘为机器的关健部分,直接影响机器的使用效果,所以本设计着重对粉碎刀盘和驱动电机进行设计论述。对于粉碎刀盘和刀片,先对工作载荷进行力学分析,计算流体阻力,进而选择......
  • redis通过6379端口无法连接服务器
    今天免费领取了一台云耀云服务器,但是在部署redis的时候碰到了redis在外网无法访问的情况,以下是针对碰到的问题,解决过程的记录。如果配置Redis在不可预知的情况下只能在内网访问,而外网无法访问,先检查一下步骤是否配置1、需要考虑到Redis配置本身是否支持远程外网访问,在redis的配置......
  • Docker 实战:快速安装 Nginx、Redis、MySQL 等常用软件
    演示下如何使用Docker来完成Redis,Tomcat和MySQL等常用软件的安装。介绍了这几个常见的软件安装之后,以后想要安装其他软件,也是依样画葫芦即可。‍总体步骤一般来说,按照如下步骤来完成安装:搜索镜像拉取镜像查看镜像启动镜像(可能需要配置端口映射)容器的操作(例如启停)......
  • Redis的五大数据类型
    Redis的五大数据类型目录一、String数据类型1.SET/GET/APPEND/STRLEN:2.INCR/DECR/INCRBY/DECRBY:3.GETSET:4.SETEX:5.SETNX:6.MSET/MGET/MSETNX:二、List数据类型1.LPUSH/LPUSHX/LRANGE:2.LPOP/LLEN:3.LREM/LSET/LINDEX/LTRIM:4.LINSERT:5.RPUSH/RPUSHX/RPOP/RPOPLPU......
  • redis本机安装
    redis本机安装1、windows版下载:Releases·microsoftarchive/redis·GitHub 2、下载后解压下载的文件即可,无需安装3、 启动服务第一种先点击redis-server.exe再点击redis-cli.exe,两个窗口都不用关,然后开始敲命令第二种运行指令:redis-server.exeredis.windows.c......
  • RAG与LLM原理及实践(17)---Docker Redis & Python Usage
    目录背景Redis环境download修改镜像RunRedisCodingpythonredisdownload基本使用描述完整代码运行结果高阶用法序列化的方式 Snapshot与AOF快照(RDB)AOF(Append-OnlyFile)代码总结发布与订阅描述     代码运行结果注意事项解释Transanction......