redis
內部使用檔案事件處理器file event handler
,這個檔案事件處理器是單執行緒的,所以redis
才叫做單執行緒的模型。
它採用io 多路復用機制同時監聽客戶端的多個連線(多個socket
),根據socket
上的事件來選擇對應的事件處理器進行處理。
檔案事件處理器的結構包含4
個部分:
多個socket
可能會併發產生不同的操作,每個操作對應不同的檔案事件,但是io
多路復用程式會監聽多個socket
,會將socket
產生的事件放入佇列中排隊,事件分派器每次從佇列中取出乙個事件,把該事件交給對應的事件處理器進行處理。
來看客戶端與redis
的一次通訊過程:
1)純記憶體操作;
2)核心是基於非阻塞的io
多路復用機制;
3)單執行緒反而避免了多執行緒的頻繁上下文切換問題。
雖然說redis
是單執行緒模型,但是, 實際上,redis
在 4.0 之後的版本中就已經加入了對多執行緒的支援。
不過,redis 4.0
增加的多執行緒主要是針對一些大鍵值對的刪除操作的命令,使用這些命令就會使用主處理之外的其他執行緒來「非同步處理」。
大體上來說,redis 6.0
之前主要還是單執行緒處理。
那,redis6.0
之前 為什麼不使用多執行緒?
我覺得主要原因有下面3
個:
單執行緒程式設計容易並且更容易維護;
redis
的效能瓶頸不再cpu
,主要在記憶體和網路;
多執行緒就會存在死鎖、執行緒上下文切換等問題,甚至會影響效能。
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個執行緒
七 執行緒操作
include include include include include include include include include include include define buffer 512 struct copy file void copy void arg if bytes...
CUDA 學習(七) 執行緒束
一 概述 執行緒束是gpu的基本執行單元。gpu是一組simd 向量處理器的集合。每一組執行緒或執行緒束中的執行緒同時執行。在理想狀態下,獲取當前指令只需要一次訪存,然後將指令廣播到這個執行緒所占用的所有sp中。當使用gpu進行程式設計時,必須使用向量型別指令,因為gpu採用的是向量體系結構,只有讓...
C 執行緒處理 七 執行緒實列
本筆記摘抄自 記錄一下方便資料查詢。伺服器端頁面 這裡牽涉到httphandle物件問題,這個物件在asp.net中是真正處理資料的物件,後面如果有時間也和大家分享下深入理解asp.net系列,主要是介紹在asp.net中一些核心物件為我們默默做的一些事情,在這裡也不詳細介紹httphandle物件...