1. 程式人生 > 資料庫 >Redis(十二)——Redis為什麼是單執行緒的?

Redis(十二)——Redis為什麼是單執行緒的?

一、Redis為什麼是單執行緒的?

1.redis在記憶體中執行,CPU不是效能瓶頸。

快:基於記憶體,避免磁碟I/O操作;採用key-value儲存,資料操作時間複雜度為O(1);

多執行緒技術是為了充分利用CPU,但是redis吞吐量很大,1s能處理106個請求。所有redis操作都只在記憶體中完成,不會涉及任何I/O操作,速度夠快。多執行緒上下文切換也要開銷,頻繁的對執行緒的上下文進行切換可能還會導致效能地急劇下降。

2.使用單執行緒也能併發處理客戶端的請求

使用I/O多路複用機制併發處理來自客戶端的多個連線,同時等待多個連線傳送的請求。

在 I/O 多路複用模型中,最重要的函式呼叫就是 select

 以及類似函式,該方法的能夠同時監控多個檔案描述符(也就是客戶端的連線)的可讀可寫情況,當其中的某些檔案描述符可讀或者可寫時,select 方法就會返回可讀以及可寫的檔案描述符個數。

3.可維護性

多執行緒就是引入併發控制來保證多個執行緒同時訪問資料時程式行為的正確性,需要打工人額外維護併發控制的相關程式碼,例如併發讀寫的變數上增加互斥鎖等,一旦忘記獲取鎖或者忘記釋放鎖就可能會導致各種詭異的問題,管理相關的併發控制機制也需要付出額外的研發成本和負擔。

二、為什麼Redis4.0後的版本引入多執行緒支援?

在 Redis 4.0 之後的版本,情況就有了一些變動,新版的 Redis 服務在執行一些命令時就會使用 主處理執行緒 之外的其他執行緒,例如 UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC 等非阻塞的刪除操作。

對於刪除操作,如果鍵值對所佔用的記憶體空間較小,單執行緒同步刪除損耗也不會太大,如果鍵值對佔用的記憶體空間較大,幾十兆的檔案,毫秒內是無法刪除的,且釋放記憶體也會有時間消耗,這些操作會阻塞其它操作,但是這些刪除釋放操作對其它操作並沒有任何影響,所以可以非同步執行,通過多執行緒非阻塞的釋放記憶體空間,提高執行效率。

 

簡言之,一切為了效能。