redis-事件

redis的主要事件源包括信号,网络,文件和时间事件,文件事件没看到用于做什么。

1、信号事件

redis忽略了SIGHUP和SIGPIPE信号,当收到SIGTERM信号时,将会置标志位,在定时任务serverCron中安全退出,这个定时任务1毫秒执行一次。

2、网络事件

1)redis启动的时候使用anetTcpServer创建服务的fd,并开始监听服务的fd。

2)创建服务fd的读事件,事件处理函数acceptTcpHandler。

3)当接收到connect请求时,redis为新连接生成一个新的fd,并创建一个redisClient。

4)设置连接noblock,nodelay,创建新fd的读事件,事件处理函数readQueryFromClient。

5)处理完client的命令后,创建一个写事件,给client回复响应,回复完删除这个写事件。

3、时间事件

redis的时间事件是通过双向链表实现的,目前redis主要的时间事件就是serverCron,1毫秒执行一次,其它的定时任务都是在serverCron中调用的,因为时间事件只有这一个,所以redis的实现逻辑都是O(n)的。

4、其它

1)linux版本的redis是使用epoll模型来处理并发请求的,使用LT的模式,socket是非阻塞的。

LT(level triggered)是缺省的工作方式,并且同时支持block和no-blocksocket。在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表。

ET(edge-triggered)是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了(比如,你在发送,接收或者接收请求,或者发送接收的数据少于一定量时导致了一个EWOULDBLOCK 错误)。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就绪),内核不会发送更多的通知(only once)。

2)redis处理事件的函数先找到最近的时间事件,然后把这个时间作为epoll_wait的超时时间参数,这样做可以把时间事件之外的时间都用于处理其它事件,但redis的时间事件是1毫秒一次,所以应该每次超时时间都是0。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • epoll概述 epoll是linux中IO多路复用的一种机制,I/O多路复用就是通过一种机制,一个进程可以监视多...
    发仔很忙阅读 13,735评论 4 35
  • 看到网上有不少讨论epoll,但大多不够详细准确,以前面试有被问到这个问题。不去更深入的了解,只能停留在知其然...
    电台_Fang阅读 14,105评论 0 8
  • 本文的讨论,暂时忽略redis数据结构和算法层面的东西。 目录 redis如此之快的原因 redis server...
    tafeng阅读 13,511评论 0 6
  • redis服务器是一个事件驱动型的,主要包括以下两种类型的事件:(1)文件事件:客户端与服务器的socket连接,...
    tracyzht阅读 4,509评论 1 6
  • 本文摘抄自linux基础编程 IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设...
    lintong阅读 5,525评论 0 4