Redis单线程为什么还能这么快?

1.Redis是个单线程程序!!!


因为它的所有数据都存储在内存中,所有的运算都是内存级别的运算。正因为redis是单线程,所以要小心使用redis指令,对于那些时间复杂度O(N)级别的指令一定要谨慎使用,否则一不小心会导致redis卡顿。


2.Redis既然是单线程,如何能处理那么多的并发客户端请求?


  • 非阻塞IO (noblocking I/O)

当用户线程发起一个read操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。
所以事实上,在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。

  • 事件轮询 (多路复用 I/O multiplexing 举手模式)

在多路复用IO模型中,会有一个线程不断去轮询多个socket的状态,只有当socket真正有读写事件时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有在真正有socket读写事件进行时,才会使用IO资源,所以它大大减少了资源占用。

你可能感兴趣的