Redis线程IO模型

Redis是单线程程序,采用非阻塞ID来处理请求.非阻塞IO在套接字对象上提供了一个选项Non_Blocking,当

这个选项打开时,读写方法不会阻塞,而是能读多少读多少,能写多少写多少.能读多少取决于内核为套接字分

配的读缓冲区内部的数据字节数,能写多少取决于内核为套接字分配的写缓冲区的空闲空间字节数.读方法和

写方法都会通过返回值来告知程序实际读写了多少字节.

有了非阻塞IO意味着线程在读写IO时可以不必再阻塞了,读写可以瞬间完成然后线程可以继续干别的事了.

  • 事件轮询(多路复用):select,epoll,kqueue
  • 指令队列:Redis会将每个客户端套接字(客户端连接)都关联到一个指令队列.客户端的指令通过队列来排队
                      顺序处理,先到先服务.
  • 响应队列:Redis同样也会为每个客户端套接字关联一个响应队列,Redis服务器通过响应队列来将指令的返回
                      结果回复给客户端.如果队列为空,那么意味着连接暂时处于空闲状态,不需要去获取写事件,也就是
                      可以将当前的客户端描述符从write_fds里面移出来.等到队列有数据了,再将描述符放进去.
  • 定时任务:Redis的定时任务会记录再一个被称为最小堆的数据结构中.这个堆中,最快要执行的任务排在堆的最
                      上方.在每个循环周期,Redis都会将最小堆里面已经到点的任务立即进行处理.处理完毕后,将最快要执
                      行的任务还需要的时间记录下来,这个时间就是select系统调用的timeout参数.      


猜你喜欢

转载自www.cnblogs.com/jdktomcat/p/10844541.html