這篇文章為大家帶來了關於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 的一個線程模型。初次接觸的話是可能會比較的難以理解,但是沒有關係的。這張圖的話其實也是可以輔助大家去加深這個意圖。
然後他整個處理的流程,也是可以跟著我所說的話來理解。為了方便大家的一個理解,我們在這裡畫一個圖啊,來做個舉例。
假設我們現在呢有一個KTV,這個KTV就是redis。
然後呢我們有很多的顧客要去唱歌,要去唱歌的話,我們KTV裡面一定會有員工嘛,員工的話我們會分為兩大類。
第一個大類是門口的接待員,第二個是大廳經理。
門口的接待員其實他就是一個多路復用器,大堂經理的話其實就是一個文件分配器。
然後呢,我們的顧客肯定是有一些相應的請求吧,或者說是相應的需求,這個時候肯定是要問我們的門口的接待員,讓門口的接待員去做簡單的一些處理。
可能他要去看看這個使用者想要去參加什麼樣的活動,有沒有優惠券等等。
然後門口的接單員,如果說確定這個顧客要去唱歌的話,就可以說請往後面走,後面有一個通道。這個通道的話其實就是一個隊列,你們排隊往這個通道走。走到裡面的話,就是我們整個KTV的一個營業廳了。到營業廳裡面它會有一個大廳經理,大堂經理的話會去處理我們的一個顧客真實的請求。
接著在我們的一個KTV裡面,其實我們的一定會有一個包廂,每一個包廂的話是會去處理用戶,去處理顧客不同的請求的了。在我們的這個包廂的內部呢,會有三個小姐姐或小哥哥,他們呢是會為用戶去處理不同的一些需求的。
比方說第一個的話,他就專門是為顧客去開門的。開門這個動作就等於是我們的一個客戶端和release 去建立了一個連結。門打開以後,你就可以進來了,對吧?進來以後的話,這個小姐姐就不負責他相應的一些工作了,他就會把他交給我們的下面的一個人,下面的一個小姐姐或者小哥哥,就是專門為用戶去處理一些請求的。
比方說某一個顧客要點歌的,這個時候就會讓點歌的人做一些相應的處理。這個處理的話就是打開電腦去點歌選歌。選完歌了以後,你得要回應給顧客吧。你有沒有點好,對吧?你還要把一些麥克風麥克風遞給顧客,所以這個時候會有一個通知,有這樣的一個小姐姐,這個小姐姐會把這個麥克風給到顧客。你現在可以去唱歌了,我們這個歌已經是為你點好了,你去唱吧。
這時候其實就完成了一個顧客在KTV裡面點歌唱歌這一整個動作。這個其實也就是對應在我們之前,我們在release 這個線程模型裡面所提及的某一個客戶端執行的一個操作吧。首先是建立連接,然後呢去處理請求,然後呢去回應他的一個請求。這個總共這裡有三步驟操作。
在我們這一塊裡面的話,整個大堂經理以及是他們點歌通知這一系列的操作的話,其實都是在我們的內部去做處理的。也就是基於我們的一個包廂。包廂的話,在我們的redis裡面,咱們是不是可以把它作為是一個內存啊,因為redis一個存儲讀取等等的操作,其實都是基於內存的。所以在內存裡面的話它是非常的快的。
在我們的包廂裡面的話,包廂裡面你不管是去唱歌還是點一些水果啊,喝一些啤酒啊等等。其實都是基於我們內部的一個包廂去做操作的話,它的一系列的動作等等的話,完成度其實也是非常的快的。
這個其實可以為了我們的一個執行緒模型去做了樸素的理解。對於我們的redis 來講的話,它其實是一個單線程模式。為什麼使用單線程模型會非常的快呢?
其實主要是有兩點。
第一點的話是我們的一個門口的接待員,其實也就是一個多工器。這個多工器的話,它是基於一個非阻塞的模型,所以呢它處理起來是非常的快的。它不會因為以前的一種阻塞模式,而一個一個的去等待去回應。現在使用了一個IO多工器這樣的模型以後,其實它的一個處理效能是非常非常的快的。
另外一部分就是我們的大廳經理這一塊,這一塊其實它是基於記憶體去做操作的。純內存的操作的話,其實它是會非常非常的快的。
當然使用了單執行緒以後,其實它的一個作用也說了,使用單執行緒的話,它是可以避免在多執行緒的時候。因為你多執行緒的話,你有可能會使用到它的一個上下文的一個切換。一旦切換的話,有可能會造成一些問題。另外呢也是可以避免一些相對應的損耗的。所以當我們在使用乾線模型的時候,它的一個是並發性,它的效率是非常非常的高的。
推薦學習:Redis影片教學
以上是圖文解析Redis執行緒模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Redis是一個強大的數據庫解決方案,因為它提供了極速性能、豐富的數據結構、高可用性和擴展性、持久化能力以及廣泛的生態系統支持。 1)極速性能:Redis的數據存儲在內存中,讀寫速度極快,適合高並發和低延遲應用。 2)豐富的數據結構:支持多種數據類型,如列表、集合等,適用於多種場景。 3)高可用性和擴展性:支持主從復制和集群模式,實現高可用性和水平擴展。 4)持久化和數據安全:通過RDB和AOF兩種方式實現數據持久化,確保數據的完整性和可靠性。 5)廣泛的生態系統和社區支持:擁有龐大的生態系統和活躍社區,

Redis的關鍵特性包括速度、靈活性和豐富的數據結構支持。 1)速度:Redis作為內存數據庫,讀寫操作幾乎瞬時,適用於緩存和會話管理。 2)靈活性:支持多種數據結構,如字符串、列表、集合等,適用於復雜數據處理。 3)數據結構支持:提供字符串、列表、集合、哈希表等,適合不同業務需求。

Redis的核心功能是高性能的內存數據存儲和處理系統。 1)高速數據訪問:Redis將數據存儲在內存中,提供微秒級別的讀寫速度。 2)豐富的數據結構:支持字符串、列表、集合等,適應多種應用場景。 3)持久化:通過RDB和AOF方式將數據持久化到磁盤。 4)發布訂閱:可用於消息隊列或實時通信系統。

Redis支持多種數據結構,具體包括:1.字符串(String),適合存儲單一值數據;2.列表(List),適用於隊列和棧;3.集合(Set),用於存儲不重複數據;4.有序集合(SortedSet),適用於排行榜和優先級隊列;5.哈希表(Hash),適合存儲對像或結構化數據。

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3漢化版
中文版,非常好用

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能