Redis 事件
- 文件事件:Redis 服务器通过套接字与客户端(或者其他 Redis 服务器)进行连接,文件事件是服务器对套接字操作的抽象。
- 时间事件:Redis 服务器中一些操作(比如 serverCron 函数)需要在给定的时间点执行,时间事件是对这类定时操作的抽象。
文件事件
-
Redis 基于 Reactor 模式开发了网络事件处理器,被称为文件事件处理器。
-
文件事件处理器使用 I/O 多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
-
当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
-
文件事件处理器的四个组成部分:
-
Reis 的 I/O 多路复用程序的所有功能都是通过包装常见的 select、epoll、evport、kqueue 这些 I/O 多路复用函数库实现的。
-
Redis 为每个 I/O 多路复用函数都实现了相同的 API,所以 I/O 多路复用程序的底层是可以互换的。程序在编译时自动选择系统中性能最高的函数来做底层实现。
-
如果一个套接字既可读又可写的话,那么服务器将先读套接字,后写套接字。
-
文件事件的处理器:
- 连接应答处理器
- 命令请求处理器
- 命令回复处理器
时间事件
-
分类:
- 定时事件
- 周期性事件
-
实现:无序链表
-
应用实例:serverCron 函数
- 更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等。
- 清理数据库中的过期键值对。
- 关闭和清理连接失败的客户端。
- 尝试进行 AOF 或 RDB 持久化操作。
- 如果服务器是主服务器,那么对从服务器进行定期同步。
- 如果处理集群模式,对集群进行定期同步和连接测试。
- redis.conf hz 选项调整 serverCron 的每秒执行次数。
事件的调度与执行
- 时间事件会将非常耗时的持久化操作放到子线程或者子进程执行。
- 因为时间事件在文件事件之后执行,并且事件之间不会出现抢占,所以时间事件的实际处理时间,通常会比设定的时间晚一些。