Redis是單執行緒的,但是為什麼還那麼快
- 完全基於記憶體的,C語言編寫
- 採用單執行緒,避免不必要的上下文切換可競爭條件
- 使用多路IO複用模型,非阻塞IO
例如: bgsave 和 bgrewriteaof 都是在後臺執行操作,不影響主執行緒的正常使用,不會產生阻塞
解釋一下多路IO複用模型?
多路IO複用模型是指利用單個執行緒來同時監聽多個Socket,並在某個Socket可讀、可寫時得到通知,從而避免無效的等待,充分利用CPU資源。目前的IO多路複用都是採用的epoll模式實現,它會在通知使用者程序Socket就緒的同時,把已就緒的Socket寫入使用者空間,不需要挨個遍歷Socket來判斷是否就緒,提升了效能。
其中Redis的網路模型就是使用IO多路複用結合事件的處理器來應對多個Socket請求,比如,提供了連線應答處理器、命令回覆處理器,命令請求處理器。在Redis6.0之後,為了提升更好的效能,在命令回覆處理器使用了多執行緒來處理回覆事件,在命令請求處理器中,將命令的轉換使用了多執行緒,增加命令轉換速度,在命令執行的時候,依然是單執行緒。