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

圖文解析Redis執行緒模型

May 25, 2022 pm 01:52 PM
redis

這篇文章為大家帶來了關於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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis指令怎麼用 redis指令怎麼用 Apr 10, 2025 pm 08:45 PM

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

redis怎麼使用鎖 redis怎麼使用鎖 Apr 10, 2025 pm 08:39 PM

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

redis底層怎麼實現 redis底層怎麼實現 Apr 10, 2025 pm 07:21 PM

Redis 使用哈希表存儲數據,支持字符串、列表、哈希表、集合和有序集合等數據結構。 Redis 通過快照 (RDB) 和追加只寫 (AOF) 機制持久化數據。 Redis 使用主從復制來提高數據可用性。 Redis 使用單線程事件循環處理連接和命令,保證數據原子性和一致性。 Redis 為鍵設置過期時間,並使用 lazy 刪除機制刪除過期鍵。

redis怎麼讀源碼 redis怎麼讀源碼 Apr 10, 2025 pm 08:27 PM

理解 Redis 源碼的最佳方法是逐步進行:熟悉 Redis 基礎知識。選擇一個特定的模塊或功能作為起點。從模塊或功能的入口點開始,逐行查看代碼。通過函數調用鏈查看代碼。熟悉 Redis 使用的底層數據結構。識別 Redis 使用的算法。

redis怎麼做消息中間件 redis怎麼做消息中間件 Apr 10, 2025 pm 07:51 PM

Redis 作為消息中間件,支持生產-消費模型,可持久化消息並保證可靠交付。使用 Redis 作為消息中間件可實現低延遲、可靠和可擴展的消息傳遞。

See all articles