Redis線程模型
Redis內部使用的文件事件處理器(基于Reactor模式開發的)file event handler是單線程的,所以Redis線程模型才叫單線程模型,它采用IO多路復用機制同時監聽多個socket,當被監聽的socket準備好執行accep、read、write、close等操作時,IO多路復用程序會將這些事件的socket壓入一個隊列中,然后有序地的將這些socket傳送給文件事件分派器,文件事件分派器接收到socket之后會根據socket產生的事件類型調用對應的事件處理器進行處理。
什么是IO多路復用機制?
IO多路復用技術是一種處理并發IO操作的技術,核心是讓單個線程去監視多個連接,一旦某個連接觸發了讀、寫事件,就去通知應用程序,去處理這個鏈接,傳統的IO模型中,會為每一個連接開啟一個線程處理其IO事件,這種模型系統開銷大,資源消耗高,IO多路復用通常是通過調用系統的 select poll epoll 來監視IO事件。
IO多路復用技術的優點?
- 減少了線程的創建和開銷,減少了系統的資源消耗。
- 提高了系統的并發能力,同等資源下可以處理更多的IO事件。
- 通過事件驅動的方式,避免了輪詢方式的消耗。
文件事件處理器的組成部分?
- 多個socket。
- IO多路復用程序。
- 隊列。
- 文件事件分配器。
- 文件事件處理器。
文件事件處理器有哪些具體的處理器?
- 連接應答處理器:用于處理客戶端的連接請求。
- 命令請求處理器:用于執行客戶端傳過來的命令。
- 使用(使用次數最少)淘汰算法,LFU是淘汰一段時間內,使用次數最少的key。
Reidis 是單線程的為什么效率還這么高?
- Redis是基于內存操作的,數據存儲在內存中,純內存訪問,而內存訪問的速大概是100納秒。
- 非阻塞的IO模型,Redis使用epol來實現IO多路復用技術,再加上Redis自身的事件處理模型,不在IO上浪費時間。
- 單線程避免了線程競爭切換帶來的時間消耗。
- 高效的數據結構,合理的數據編碼。
- 合理的線程模型,基于非阻塞的IO多路復用技術。
那為什么Redis 6.0之后又改用多線程呢?
隨著網絡硬件的發展,Redis開發者發現Redis的性能問題有時候會出現在網絡IO處理上,單個線程處理網絡請求的速度跟不上底層硬件的速度,于是在Redis 6.0中提出了多線程模型,可以采用多個IO線程來處理網絡請求,提高處理網絡請求的速度,Redis的多線程模型并不是拋棄了單線程,Redis還是使用單線程處理客戶端請求,執行讀寫命令。
Redis多線程模式是默認關閉的。
如有不正確的地方請各位指出糾正。