一. 概述
Redis 服务器是一个事件驱动程序, 服务器需要处理两类事件: 1 文件事件, 2 时间事件. 文件事件是关于客户端与服务器之间的通信操作. 时间事件是关于服务器内部的一些定时操作. 本篇还是参照 "Redis 设计与实现" 书, 简要了解下 Redis 事件.
1. 文件事件
文件事件 (file event) 是服务器对套接字操作的抽象(套接字, 是支持 TCP/IP 的网络通信的基本操作单元, 可以看做是不同主机之间的进程进行双向通信的端点), 通过套接字与客户端或者其它 Redis 服务器进行连接, 服务端与客户端的通信产生相应的文件事件, 服务器则通过监听并处理这些文件事件来完成一系列网络通信操作.
Redis 基于 Reactor(反应器)模式开发了自己的网络事件处理器, 这个处理器被称为文件事件处理器. 文件事件处理器使用 I/O 多路复用程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器.
当被监听的套接字准备好执行连接应答, 读取, 写入, 关闭等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件.
文件事件处理器包括套接字, I/O 多路复用程序, 文件事件分派器, 事件处理器. 下面展示了四个组成部分.
当多个套接字做连接, 写入, 读取, 关闭等命令操作时, 就会产生多个并发文件事件. I/O 多路复用程序负责监听多个套接字放入队列中, 然后通过队列, 以有序, 同步, 每次一个套接字的方式向文件事件分派器传送, 当上一个套接字产生的事件被处理后, 事件分派器会继续传送下一个套接字.
下面简单描述一个通信过程:(1)当一个 Redis 客户端向服务器发起连接, 那么监听套接字将产生 ae_readable 事件(该事件是指当客户端对套接字执行 write,close,connect 操作), 触发连接应答处理器执行. 该处理器会对客户端的连接请求进行应答, 然后创建客户端套接字, 客户端状态. 使得客户端可以向服务器发送命令请求.
(2)执行客户端命令后将产生相应的命令回复, 为了将这些命令回复传送回客户端, 服务器会将客户端套接字的 ae_writable 事件 (该事件是指客户端对套接字执行 read 操作) 与命令回复处理器进行关联, 当客户端尝试读取命令回复的时候, 会触发命令回复处理器执行.
2. 时间事件
时间事件 (time event) 是 Redis 服务器中的一些操作如 serverCron 函数, 需要在给定的时间点执行, 而时间事件就是服务器对这类定时操作的抽象. 时间事件分为两类: 1 定时事件: 让一段程序在指定的时间之后执行一次. 2. 周期性事件: 让一段程序每隔指定时间表就执行一次.
持续运行的 Redis 服务器需要定期对自身资源和状态进行检查和调整, 从而确保服务器可以长期, 稳定的运行, 主要工作包括:
(1) 更新服务器的各类统计信息, 比如时间, 内存占用, 数据库占用情况等.
(2) 清理数据库中的过期键值对.
(3) 关闭和清理连接失败的客户端.
(4) 尝试进行 AOF 和 RDB 持久化操作.
(5) 如果服务器是主服务器, 那么对从服务器进行定期同步.
(6) 如果处于集群模式, 对集群进行定期同步和连接测试.
Redis 服务器对周期性事件的方式运行 Redis.c/serverCron 函数, 直到服务器关闭为止. 在配置上, 用户通过修改 hz 选项来调整 serverCron 的每秒执行次数. 默认是每秒执行 10 次.
- 127.0.0.1:6379> config get hz
- 1) "hz"
- 2) "10"
来源: https://www.cnblogs.com/MrHSR/p/10053170.html