Redis如何处理每条指令的

事件模型

epoll

响应队列

redis为每个客户端socket关联了一个响应队列,redis服务通过响应队列来将指令的返回结果回复给客户端。如果队列为空,那么意味着连接暂时处于空闲状态,不需要去获取写事件,也就是可以将当前的客户端描述符从write_fds里移出来。等到队列有数据了,再将描述符放进去,避免select系统调用立即返回写事件,结果发现没有数据,这样会白白耗费CPU。

定时任务

redis服务器除了要响应客户端的IO事件外,还需要处理其他事情,比如渐进式hash操作、持久化操作、过期删除、主从同步等,这些任务都会存储在一个最小堆中,在每个事件循环周期中,redis都会对最小堆堆顶的任务进行处理,并将执行下次任务的时间记录下来,这个时间就是select系统调用的timeout函数。redis使用了epoll,所以将下次执行任务的时间作为epoll_wait的timeout参数,在这时间之后没有收到IO的任务就触发定时任务。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章