惠州网站建设公司排名,乐山智顶网站建设,遂宁微章建设举报网站,仿门户网站多功能js相册画廊源码目录文件事件处理事件类型客户端和服务端的通信过程时间事件处理执行器执行周期性事件作用事件的调度与执行文件事件处理
Redis基于Reactor模式开发了文件事件处理器。文件事件处理器以单线程方式运行#xff0c;通过IO多路复用程序监听多个套接字#xff0c;实现了高性能网… 目录文件事件处理事件类型客户端和服务端的通信过程时间事件处理执行器执行周期性事件作用事件的调度与执行 文件事件处理
Redis基于Reactor模式开发了文件事件处理器。文件事件处理器以单线程方式运行通过IO多路复用程序监听多个套接字实现了高性能网络通信模型又可以很好的与Redis服务器中同样以单线程运行的模块进行对接保证了设计的简单性。 文件事件处理器的构成套接字、I/O多路复用程序、文件事件分派器、事件处理器
每当一个套接字准备好执行连接应答、写入、读取、关闭操作时就会产生一个文件事件。一个服务器通常会连接多个套接字所以多个文件事件有可能并发出现。 I/O多路复用程序负责监听多个套接字并向文件事件分派器传送产生了事件的套接字。 I/O复用程序总是将所有产生事件的套接字放在一个队列里通过这个队列以有序、同步、每次一个套接字的方式向文件事件分派器传送套接字。
事件类型
当套接字可读客户端对套接字执行write操作或者执行close操作或者有新的可应答套接字出现客户端对服务器的监听套接字执行connect操作套接字产生AE_READABLE事件当套接字可写客户端对套接字执行read操作套接字产生AE_WRITABLE 如果一个套接字同时产生了这两种事件那么事件分派器会优先处理读套接字后处理写套接字。
客户端和服务端的通信过程 时间事件处理
一个时间事件主要由三个属性组成 1、id全局唯一id新事件的id比老事件的id大 2、when记录时间事件的到达时间ms级别 3、timeProc时间时间处理器表示事件到达服务器会调用相应的函数 时间事件分为定时事件与周期性事件区别在于定时事件在到达一次之后就会被删除之后不再到达。而周期性事件在到达一次之后会对when属性更新值表示在一段时间后再次到达。 Redis的实现原理是将所有的时间事件放在一个无序链表中每当时间事件执行器运作遍历链表查找所有已达到时间时间并调用相应的事件处理器。新的时间时间总是插入链表头部所以往往是按照ID逆序排列的这里无序表示不按照when属性大小排序。 由于时间事件个数较少所以无序链表并不影响时间事件处理器的性能。
执行器执行
执行器具体执行步骤如下
遍历服务器中的所有时间事件
for (time_event : list)
{检查该事件是否已经到达if (time_event now_time) {已到达执行事件处理器获取返回值retval time_event.timeProc()如果是一个定时事件将事件从服务器中删除if (retval AE_NOMORE) delete_time_event(time_event)else否则更新when让该事件在指定时间后再次到达update_when(time_event, retval )}
}周期性事件作用
Redis服务器需要定期对自身的资源和状态进行检查和调整此时就会用到serverCron函数该函数就是以周期性事件触发的。默认是每秒运行10次。 主要作用为 1、更新服务器各类统计信息如时间、内存占用、数据库占用情况 2、清理数据库中过期键值对 3、关闭和清理连接失效的客户端 4、尝试进行AOF或RDB持久化操作 5、如果是主服务器还需要对从服务器定期同步 6、如果处于集群模式还需要对集群定期同步和连接测试
事件的调度与执行
文件事件与时间事件之间是合作关系服务器会轮流处理两种事件并且处理的过程中也不会进行在·抢占所以时间时间的实际处理时间通常回避设定到达时间晚一些。 事件处理角度下的服务器运行流程 需要注意的点 1、为了避免服务器对时间时间进行频繁轮询忙等待也为了避免阻塞过长时间每次最大阻塞时间由到达时间最接近当前时间的时间事件决定。 2、文件事件是随机出现的所以等处理完一个文件事件之后如果还没有时间事件到达则服务器再次等待并处理文件事件随着文件事件不断执行逐渐接近时间事件设置的到达时间。 3、由于文件处理时同步、有序、原子执行所以服务器不会中断事件处理也不会对事件进行抢占。所以不管是那种事件的处理都需要尽可能减少程序阻塞时间。将耗时的操作放到子线程或者子进程中处理