redis為什麼是單執行緒的
阿新 • • 發佈:2019-02-16
單純的網路IO來說,量大到一定程度之後,多執行緒的確有優勢, 但並不是單純的多執行緒,而是每個執行緒自己有自己的epoll這樣的模型,
也就是多執行緒和multiplexing混合。但是。還要考慮Redis操作的是記憶體中的資料結構。如果在多執行緒中操作,那就需要為這些物件加鎖。
所以使用多執行緒可以提高效能,但是每個執行緒的效率嚴重下降了,而且程式的邏輯嚴重複雜化。Redis的資料結構並不全是簡單的Key-Value,
還有list,hash等複雜的結構,這些結構有可能會進行很細粒度的操作,比如在很長的列表後面新增一個元素,在hash當中新增或者刪除
一個物件,這些操作還可以合成MULTI/EXEC的組。這樣一個操作中可能就需要加非常多的鎖,導致的結果是同步開銷大大增加。Redis
在權衡之後的選擇是用單執行緒,突出自己功能的靈活性。在單執行緒基礎上任何原子操作都可以幾乎無代價地實現,多麼複雜的資料結構都
可以輕鬆運用,甚至可以使用Lua指令碼這樣的功能。對於多執行緒來說這需要高得多的代價。
並不是所有的KV資料庫或者記憶體資料庫都應該用單執行緒,比如ZooKeeper就是多執行緒的,最終還是看作者自己的意願和取捨。單執行緒
的威力實際上非常強大,每核心效率也非常高,在今天的虛擬化環境當中可以充分利用雲化環境來提高資源利用率。多執行緒自然是可以比單
執行緒有更高的效能上限,但是在今天的計算環境中,即使是單機多執行緒的上限也往往不能滿足需要了,需要進一步摸索的是多伺服器叢集化
的方案,這些方案中多執行緒的技術照樣是用不上的,所以單執行緒、多程序的叢集不失為一個時髦的解決方案。