Redis 基础-原理分析(第五章)

1. 线程 IO 模型

1.1. Redis 单线程为什么还能这么快

  • 因为它所有的数据都在内存中,所有的运算都是内存级别的运算
  • 采用单线程,避免了不必要的上下文切换和竞争条件,不用去考虑各种锁的问题
  • 使用多路I/O复用模型,非阻塞I/O
  • 缺点是耗时的命令会导致并发的下降,无法发挥多核CPU性能

1.2. Redis 单线程如何处理并发客户端连接

  采用多路复用,“多路”指的是多个网络连接,“复用”指的是复用同一个Redis处理线程。一般通过select/poll/epoll/kqueue之类的操作系统调用函数来实现,这些函数都可以同时监视多个描述符的读写就绪状况,当某个socket可读或可写时,操作系统会提供一个通知,这样当配合非阻塞的socket使用时,只有当系统通知了哪个描述符可读,才去执行read操作,可以保证每次read都能读到有效数据而不做纯返回-1EAGAIN的无用功,写操作类似。