Redis 事件
1、两类事件:
1、1: 文件事件(file event)
1、2: 时间事件(time event)
2、文件事件:
2、1: 原理:Redis服务器通过套接字与其他(客户端或其他Redis服务器)进行链接,通信时产生相应的文件事件,而服务器通过监听和处理这些事件来完成一系列网络通信操作。
2、2: 重要关键思路:文件事件通过使用I/O多路复用程序监听多个socket。(Redis单线程 但高性能的重要原因)
2、3: 与socket操作相关的事件产生时,文件事件处理器就会调用关联好的事件处理器来处理这些事件。
2、4: 文件事件的组成:socket、I/O多路复用、文件事件分派器、事件处理器
2、5:事件类型:可读事件、可写事件(优先读事件)
3、文件事件处理器
3、1: 连接应答处理器(acceptTcpHandler)
3、2: 命令请求处理器(readQueryFromClient)
3、3: 命令回复处理器(sendReplyToCLient)
一次完整的客户端与服务器连接事件:
(1)客户端向服务器发送连接请求,服务器执行连接应答处理器
(2)客户端向服务器发送命令请求,服务器执行命令请求处理器
(3)服务器向客户端发送命令回复,服务器执行命令回复处理器
4、时间事件
4、1: 时间事件分类
(1)定时事件
(2)周期性事件
4、2: 时间事件的组成
(1)ID:唯一标识,顺序递增
(2)when:毫秒unix时间戳,记录时间事件的到达时间
(3)timeProc:事件处理器函数
4、3: 定时事件和周期性事件的区分:
按返回值区分,返回ae.h/AE_NOMORE为定时事件,返回非AE_NOMORE的整数为周期事件。
注:返回整数则对事件的when属性进行更新
5、事件事件的实现
5、1: 所有的时间事件都放在一个无序链表,每当时间事件执行器执行需遍历整个链表(性能?)
注:按ID排序放,非按when属性排序放
5、2:性能问题解答:在目前版本中,正常模式下的 Redis服务器只使用servercron一个时间事件,而在benchmark模式下,服务器也只使用两个时间事件。在这种情况下,服务器几乎是将无序链表退化成一个指针来使用,所以使用无序链表来保存时间事件,并不影响事件执行的性能。
6、时间时间实例:serverCron函数的作用
(1)更新服务器各类统计信息
(2)清理数据库中的过期键值对
(3)关闭和清理连接失效的客户端
(4)AOF 和 RDB持久化操作
(5)主从服务器数据同步
(6)集群模式下进行定期同步和连接测试
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。