首頁  >  文章  >  資料庫  >  圖文解析Redis執行緒模型

圖文解析Redis執行緒模型

WBOY
WBOY轉載
2022-05-25 13:52:202381瀏覽

這篇文章為大家帶來了關於Redis的相關知識,其中主要介紹了關於線程模型的相關問題,Redis它是一個單線程的,下面就一起來看一下,希望對大家有幫助。

圖文解析Redis執行緒模型

推薦學習:Redis影片教學

圖文解析Redis執行緒模型
# Redis它是一個單執行緒的,這一點需要去注意的。

首先我們呢會有一個客戶端,這個客戶端在我們之前其實使用的是一個redis client 這樣的一個工具去連接的redis server。
如果說我們後續再整合到java 裡面去的話,在java 裡面其實也會提供對應的客戶端的。

接著我們會有一個redis server,這個其實就是我們的一個redis,它整個服務在啟動以後,它是會有一個行程的。
在我們的release 裡面,在內部它其實會有兩個東西。

首先一個它會有一個多工器,這個我們上節課已經是介紹過了,它是非阻塞的一個模型。
隨後它其實還會有一個檔案事件分配器,它專門是用來去分配一些事件的。

在這個下面,它會分成三個不同的處理器,分別來看一下。

首先呢有一個連線應答處理器,最後的是一個指令請求處理器,還有是一個指令回覆處理器。

如何去理解呢?首先我們先來看一個連接應答處理器。

連接應答處理器的話,它的一個主要作用是要和我們的客戶端去保持一個連結。
像我們的一個redis server一旦啟動了以後,其實呢我們就會有read 的這樣的一個事件和我們的連接應答器會捆綁在一起。
它的全名其實叫做AE_readable。你就可以把它理解為是一種標誌啊,它會有這樣的一個事件,這個事件是會和我們的連接應答處理器捆綁到一起的。

最後當我們的一個客戶端和咱們的server 要去建立連線的時候,這個其實也就是我們在一開始在命令列工具裡面敲下了一個redis client,一開始的話肯定是需要和我們的server 去建立連線嘛。建立連線的時候,他其實就會傳送一個read 標誌,其實就是一個read 的時間,這時候的話,在我們的redis server 裡面,它其實會有一個叫做server socket。

server socket 和我們的一個客戶端socket 其實是對應的,他們是屬於網路程式設計裡面的一塊內容,他們之間是一個socket 的通訊。在我們接觸到read 這樣的一個事件了以後,然後我們呢就會交由咱們的多路復用器去進行處理吧。
交給他去處理以後的話,其實他是一個非阻塞的,拿到了以後一旦接收,他就會把它放到我們這樣的一個箭頭裡面去。

這個箭頭的話在這邊其實我們可以稱之為它是一個管道pipeline,或者我們也可以把它稱之為是一個隊列。它會往這裡面丟,丟進去以後,這個世界呢其實就會到達我們的文件事件分配器。這個分配器當它辨識到它是一個read 這樣的事件以後,它就會和我們的這個連接應答處理器去做到一個匹配,也就是交由它去進行一個處理。
它是一個read 相互進行一個匹配。
這時候的話其實可以表示咱們的client 和server 這兩端就是建立了一個連線。建立好連接了以後這個read 標識的話,這個事件它其實就會交由給我們的命令請求處理器。這個指令請求處理器的話,你就可以認為它是專門去處理請求的,也就是一個request。然後指令回覆處理器,你可以把它理解為是一個response,也就是一個回應。

隨後我們在客戶端可能要去,比方說我們要去set 一個值,對吧? set 一個值的話,比方說set name *** 這樣子的話,其實它是個指令嘛。
這個指令的話它的一個世界類型其實​​也是一個read。隨後呢經過server socket 再丟給多工器,拿到以後放到咱們的隊列裡面去再交由文件事件分配器。

這個檔案事件分配器拿到以後,它會進行一個判斷吧,它會判斷符合是read的事件。它這個時候是一個read的事件的時候,就會讓我們的指令請求處理器去處理咱們的指令。他就會去辨識了呀,他會去辨識目前就是一個set name ***,所以他就要去做一個處理。他要把我們用戶設定的一個內容,把這個鍵值做一個存儲,存儲到咱們的內存裡面去。這個其實就是一個指令請求的處理,就是一個request 。

當它處理完畢以後,隨後的話它會分配一個white,也就是寫的一個標識。這個寫的標識的話,在這邊的話,其實呢我們就可以把它當作回應。因為我們的一個請求其實在處理完畢之後,在我們輸入完畢一個指令以後,可能會看到一個ok 對吧?這個ok 的話其實等於是我們的一個指令回覆處理器回寫給我們的一個內容。所以他會用到一個write寫的一個標記。這樣子我們的一個寫的標記其實是會跟我們命令回復處理器是綁在一起的。 write 的話,其實它的全名是叫做AE_writable 這樣的一個事件類型的。

好,隨後在我們的客戶端這個地方,其實我們就需要去做一個回寫也。就是ok 或者說我們在查詢list,我們要展示list 裡面所有的內容的時候,它其實是回寫的一個狀況。我們要把內容顯示在控制台的下方,它是一個write 這樣的一個事件類型。隨後交由我們的多工器再丟給咱們的一個隊列,讓這個隊列分配給我們的一個文件事件分配器的。這個時候會配對咱們的web 事件。 web 事件是匹配到了。

隨後的話,我們的指令回覆處理器就會做一個回寫。它會把我們的ok 啊或我們的一個獲得的一個list 數量,list 裡面的內容等等。只要是一些需要展示的內容,他就會是作為一個response,就是把這個回應的內容回寫給我們的一個客戶端,在客戶端上進行一個展示。在我們目前整個模型裡面的話,其實主要就是兩個不同的事件,一個叫做readable 的,一個叫做writable 。

當然我們現在設定的只是一個客戶端,如果說我們會有多個客戶端的話,他們的道理也都是一模一樣的。這個其實就是release 的一個線程模型。初次接觸的話是可能會比較的難以理解,但是沒有關係的。這張圖的話其實也是可以輔助大家去加深這個意圖。

然後他整個處理的流程,也是可以跟著我所說的話來理解。為了方便大家的一個理解,我們在這裡畫一個圖啊,來做個舉例。

圖文解析Redis執行緒模型

假設我們現在呢有一個KTV,這個KTV就是redis。

然後呢我們有很多的顧客要去唱歌,要去唱歌的話,我們KTV裡面一定會有員工嘛,員工的話我們會分為兩大類。
第一個大類是門口的接待員,第二個是大廳經理。
門口的接待員其實他就是一個多路復用器,大堂經理的話其實就是一個文件分配器。

然後呢,我們的顧客肯定是有一些相應的請求吧,或者說是相應的需求,這個時候肯定是要問我們的門口的接待員,讓門口的接待員去做簡單的一些處理。
可能他要去看看這個使用者想要去參加什麼樣的活動,有沒有優惠券等等。

然後門口的接單員,如果說確定這個顧客要去唱歌的話,就可以說請往後面走,後面有一個通道。這個通道的話其實就是一個隊列,你們排隊往這個通道走。走到裡面的話,就是我們整個KTV的一個營業廳了。到營業廳裡面它會有一個大廳經理,大堂經理的話會去處理我們的一個顧客真實的請求。

接著在我們的一個KTV裡面,其實我們的一定會有一個包廂,每一個包廂的話是會去處理用戶,去處理顧客不同的請求的了。在我們的這個包廂的內部呢,會有三個小姐姐或小哥哥,他們呢是會為用戶去處理不同的一些需求的。

比方說第一個的話,他就專門是為顧客去開門的。開門這個動作就等於是我們的一個客戶端和release 去建立了一個連結。門打開以後,你就可以進來了,對吧?進來以後的話,這個小姐姐就不負責他相應的一些工作了,他就會把他交給我們的下面的一個人,下面的一個小姐姐或者小哥哥,就是專門為用戶去處理一些請求的。

比方說某一個顧客要點歌的,這個時候就會讓點歌的人做一些相應的處理。這個處理的話就是打開電腦去點歌選歌。選完歌了以後,你得要回應給顧客吧。你有沒有點好,對吧?你還要把一些麥克風麥克風遞給顧客,所以這個時候會有一個通知,有這樣的一個小姐姐,這個小姐姐會把這個麥克風給到顧客。你現在可以去唱歌了,我們這個歌已經是為你點好了,你去唱吧。

這時候其實就完成了一個顧客在KTV裡面點歌唱歌這一整個動作。這個其實也就是對應在我們之前,我們在release 這個線程模型裡面所提及的某一個客戶端執行的一個操作吧。首先是建立連接,然後呢去處理請求,然後呢去回應他的一個請求。這個總共這裡有三步驟操作。

在我們這一塊裡面的話,整個大堂經理以及是他們點歌通知這一系列的操作的話,其實都是在我們的內部去做處理的。也就是基於我們的一個包廂。包廂的話,在我們的redis裡面,咱們是不是可以把它作為是一個內存啊,因為redis一個存儲讀取等等的操作,其實都是基於內存的。所以在內存裡面的話它是非常的快的。

在我們的包廂裡面的話,包廂裡面你不管是去唱歌還是點一些水果啊,喝一些啤酒啊等等。其實都是基於我們內部的一個包廂去做操作的話,它的一系列的動作等等的話,完成度其實也是非常的快的。

這個其實可以為了我們的一個執行緒模型去做了樸素的理解。對於我們的redis 來講的話,它其實是一個單線程模式。為什麼使用單線程模型會非常的快呢?

其實主要是有兩點。
第一點的話是我們的一個門口的接待員,其實也就是一個多工器。這個多工器的話,它是基於一個非阻塞的模型,所以呢它處理起來是非常的快的。它不會因為以前的一種阻塞模式,而一個一個的去等待去回應。現在使用了一個IO多工器這樣的模型以後,其實它的一個處理效能是非常非常的快的。

另外一部分就是我們的大廳經理這一塊,這一塊其實它是基於記憶體去做操作的。純內存的操作的話,其實它是會非常非常的快的。

當然使用了單執行緒以後,其實它的一個作用也說了,使用單執行緒的話,它是可以避免在多執行緒的時候。因為你多執行緒的話,你有可能會使用到它的一個上下文的一個切換。一旦切換的話,有可能會造成一些問題。另外呢也是可以避免一些相對應的損耗的。所以當我們在使用乾線模型的時候,它的一個是並發性,它的效率是非常非常的高的。

推薦學習:Redis影片教學

以上是圖文解析Redis執行緒模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除