爲什麼 Redis 單線程能支撐高併發?

爲什麼Redis是單線程的

Redis是基於內存的操作,內存的讀寫速度非常快,並且CPU不會是Redis的瓶頸,在單線程的情況下,就不用去考慮各種鎖以及上下文切換的問題,關鍵的一點是Redis使用了I/O多路複用技術。

Blocking I/O

在這裏插入圖片描述
當使用 read 或者 write 對某一個文件描述符(File Descriptor 以下簡稱 FD)進行讀寫時,如果當前 FD 不可讀或不可寫,會影響其他 FD 對應的服務,整個 Redis 服務就不會對其它的操作作出響應,導致整個服務不可用。

I/O多路複用

在這裏插入圖片描述
阻塞式的 I/O 模型並不能滿足需求,需要一種效率更高的 I/O 模型來支撐 Redis 的多個客戶(redis-cli),涉及的就是 I/O 多路複用模型了。
在 I/O 多路複用模型中,最重要的函數調用就是 select,該方法的能夠同時監控多個文件描述符的可讀可寫情況,當其中的某些文件描述符可讀或者可寫時,select 方法就會返回可讀以及可寫的文件描述符個數。
Redis 服務採用 Reactor 的方式來實現文件事件處理器(每一個網絡連接socket其實都對應一個文件描述符)。
在這裏插入圖片描述 文件事件處理器使用 I/O 多路複用模塊同時監聽多個 FD,當 accept、read、write 和 close 文件事件產生時,文件事件處理器就會回調 FD 綁定的事件處理器。 雖然整個文件事件處理器是在單線程上運行的,但是通過 I/O 多路複用模塊的引入,實現了同時對多個 FD 讀寫的監控,提高了網絡通信模型的性能,同時也可以保證整個 Redis 服務實現的簡單。