一、檔案事件處理器
Redis 內部使用檔案事件處理器 file event handler,這個檔案事件處理器是單執行緒的,所以 redis才叫做單執行緒的模型,
它采用 IO 多路復用機制同時監聽客戶端的多個連接(多個 socket),根據 socket 上的事件來選擇對應的事件處理器進行處理,
檔案事件處理器的結構包含4個部分:
- 多個 socket(客戶端連接)
- IO 多路復用程式(支持多個客戶端連接的關鍵)
- 檔案事件分派器(將 socket 關聯到相應的事件處理器)
- 事件處理器(包括連接應答處理器、命令請求處理器、命令回復處理器)

多個 socket可能會并發產生不同的操作,每個操作對應不同的檔案事件,但是IO 多路復用程式會監聽多個 socket,會將 socket產生的事件放入佇列中排隊,事件分派器每次從佇列中取出一個事件,把該事件交給對應的事件處理器進行處理,
來看客戶端與 Redis 的一次通信程序:

二、為啥Redis基于單執行緒的效率還是這么高?
1)純記憶體操作;
2)核心是基于非阻塞的IO多路復用機制;
3)單執行緒反而避免了多執行緒的頻繁背景關系切換問題,
三、Redis為何不使用多執行緒
雖然說 Redis 是單執行緒模型,但是, 實際上,Redis 在 4.0 之后的版本中就已經加入了對多執行緒的支持,
不過,Redis 4.0 增加的多執行緒主要是針對一些大鍵值對的洗掉操作的命令,使用這些命令就會使用主處理之外的其他執行緒來“異步處理”,
大體上來說,Redis 6.0 之前主要還是單執行緒處理,
那,Redis6.0 之前 為什么不使用多執行緒?
我覺得主要原因有下面3個:
- 單執行緒編程容易并且更容易維護;
Redis的性能瓶頸不再CPU,主要在記憶體和網路;- 多執行緒就會存在死鎖、執行緒背景關系切換等問題,甚至會影響性能,
四、Redis6.0后引入的多執行緒機制
Redis6.0 引入多執行緒主要是為了提高網路 IO 讀寫性能,因為這個算是Redis中的一個性能瓶頸(Redis的瓶頸主要受限于記憶體和網路),
雖然,Redis6.0 引入了多執行緒,但是Redis 的多執行緒只是在網路資料的讀寫這類耗時操作上使用了, 執行命令仍然是單執行緒順序執行,因此,你也不需要擔心執行緒安全問題,
Redis6.0 的多執行緒默認是禁用的,只使用主執行緒,如需開啟需要修改 Redis 組態檔 redis.conf :
io-threads-do-reads yesCopy to clipboardErrorCopied
開啟多執行緒后,還需要設定執行緒數,否則是不生效的,同樣需要修改redis組態檔 redis.conf :
io-threads 4 #官網建議4核的機器建議設定為2或3個執行緒,8核的建議設定為6個執行緒
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263767.html
標籤:其他
