當面試官問你:Redis是單執行緒還是多執行緒?該如何回答

對於這個問題,大部分人肯定會說,Redis是單執行緒的,實現起來簡單,可以在無鎖的情況下完成所有操作,不存在死鎖和執行緒切換帶來的效能和時間上的開銷。但是也有缺點,就是單執行緒不能發揮多核CPU的效能。這個回答沒有錯,但是不夠全面。可能不會脫穎而出。那麼該如何回答呢?

我們要說Redis的不同版本這個執行緒模型是不一樣的,要分別說出不同版本的執行緒模型。

Redis4。0版本之前,使用的是單執行緒,一般來說,單執行緒的處理能力要比多執行緒差,但是Redis還能達到每秒數萬級的處理能力。首先最重要的原因是,Redis的大部分操作都在記憶體中完成,並且採用了高效的資料結構,比如雜湊表和跳錶。其次,單執行緒可以避免多執行緒之間的競爭,省去了多執行緒切換帶來的時間和效能上的開銷,而且還不會導致死鎖。最後,Redis採用了I/O多路複用機制處理客戶端的socket請求,這樣可以使Redis高效的進行網路通訊,因為是基於非阻塞的I/O模型,就意味著I/O的讀寫流程不再阻塞。

Redis4。0版本之後,添加了多執行緒的支援,但這時的多執行緒主要體現在大資料的非同步刪除功能上,例如unlink key、flushdb async、flushall async等。

Redis6。0版本之後,採用了多個I/O執行緒來處理網路請求,這是因為隨著網路硬體的效能提升,Redis的效能瓶頸有時會出現在網路I/O的處理上,所以為了提高網路請求處理的並行度,Redis6。0對於網路請求採用多執行緒來處理。但是對於讀寫命令,Redis仍然採用單執行緒來處理。