Redis服务器就是个大的事件循环,服务器主要处理以下两种事件:
- 文件事件:就是通过套接字与服务器连接的事件,包括客户端和其他Redis服务器。
- 时间事件:一些定时操作。
文件事件
文件事件是对的一种抽象。每当套接字准备好连接应答、写、读、关闭的时候就会产生一个文件事件。
Redis基于Reactor模式开发了自己的网络事件处理器——文件事件处理器。
文件事件处理器以单线程的方式运行,并且搭配了I/O多路复用来监听多个套接字,既实现了高性能的网络通信模型,又保持了内部单线程设计的简单性。
![](https://img.haomeiwen.com/i3491218/055b31dde88dd2d0.jpg)
I/O多路复用器会将事件通过队列,以有序、同步、每次一个的方式发送。
Redis 集成了 select、epoll、evport、kqueue 多个I/O多路复用函数库,可以在编译时自动选择系统中性能最高的一个作为底层实现。
时间事件
时间事件分两种:
- 定时事件:指定时间执行一次(处理器返回 AE_NOMORE);
- 定期事件:每隔指定时间执行一次(处理器返回下一次事件执行的时间戳)。
Redis中只有定期事件,没有定时事件!(也不知道为什么书上还讲)
时间事件主要有三个属性组成:
- id,事件ID;
- when,毫秒精度的时间戳;
- timeProc,对应的函数处理器。
时间事件的实现
服务器将所有时间事件都放在一个无序链表(不按when排序)中,每次定期执行时都需要遍历整个链表。新事件总是插入在链表头部(插入复杂度O(1),可以说是按ID逆序)
为什么用无序列表而不用有序列表呢?有序列表不是更好吗?
答:因为服务中的时间事件很少。正常模式下只用 serverCron,benchmark下也只用两个时间事件,所以排序无用。
serverCron与服务器的生命周期一致。它默认每秒运行10次,即约100ms执行一次,可通过配置项调整频率。
Redis的事件轮回中,先计算下一次时间事件的时间,然后阻塞等待文件事件的发生,有文件事件的话则先执行,若等到时间事件时间点,也会先把所有到来的文件事件执行完,再进行时间事件。若中间无文件事件,则会一直阻塞到时间事件时间点的到来。
网友评论