1. 线程 IO 模型
1.1. Redis 单线程为什么还能这么快
- 因为它所有的数据都在内存中,所有的运算都是内存级别的运算
- 采用单线程,避免了不必要的上下文切换和竞争条件,不用去考虑各种锁的问题
- 使用多路I/O复用模型,非阻塞I/O
- 缺点是耗时的命令会导致并发的下降,无法发挥多核CPU性能
1.2. Redis 单线程如何处理并发客户端连接
采用多路复用,“多路”指的是多个网络连接,“复用”指的是复用同一个Redis处理线程。一般通过select/poll/epoll/kqueue
之类的操作系统调用函数来实现,这些函数都可以同时监视多个描述符的读写就绪状况,当某个socket
可读或可写时,操作系统会提供一个通知,这样当配合非阻塞的socket
使用时,只有当系统通知了哪个描述符可读,才去执行read
操作,可以保证每次read
都能读到有效数据而不做纯返回-1
和EAGAIN
的无用功,写操作类似。