redis 的單執行緒主要是指 redis 的網路 io 和鍵值對讀寫是由乙個執行緒來完成的,這也是 redis 對外提供鍵值儲存服務的主要流程。當多個客戶端發起命令, 這些命令併發執行時,在redis內部,會排隊逐個執行,也就是執行命令的那個操作是由乙個執行緒執行的。
但 redis 的其他功能,比如持久化、非同步刪除、集群資料同步等,其實是由額外的執行緒執行的。
1.redis 完全基於記憶體,資料都存在記憶體中,絕大部分請求是純粹的記憶體操作,運算是記憶體級別的運算,這是redis單執行緒確有執行效率高的主要原因
2.採用單執行緒,避免了不必要的上下文切換和競爭條件,不存在多執行緒導致的 cpu 切換,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有死鎖問題導致的效能消耗
3.資料結構簡單,對資料操作也簡單
4.利用epoll來實現io多路復用,非阻塞 io,單執行緒處理併發客戶端連線
當多個客戶端併發請求redis服務時,並不是說,只有當第乙個客戶端請求執行完返回結果後,第二個客戶端的請求才會被響應。而是redis會把所有請求都接收,並放到本地佇列中去,依次放到檔案事件分派器,事件分派器將事件分發給事件處理器。
比如,乙個客戶端的命令set k v,該命令的執行過程是:首先和服務端建立連線,然後這條命令往服務端傳送資料,對於服務端來說接收命令就是乙個讀操作,當讀到這條命令時,再去執行命令,執行完之後要把執行結果返回給客戶端。在命令執行中間會有一些等待,比如可能命令比較大(比如bigkey),傳送時間長(比如1-2秒),那麼這段空出來的時間就可以執行其他命令。乙個請求過來,命令執行過程中會有好多步驟,每一步中間都有一些io的等待開銷,nio就是讓io等待開銷的過程中去執行其他執行緒的操作,不會被乙個客戶端的請求阻塞住,可以乙個執行緒響應多個客戶端請求。
也因為 redis 是單執行緒,所以對於耗時的指令,就有可能會導致 redis卡頓,要謹慎使用
Redis單執行緒理解
簡介 從接觸redis到現在,一直被它的單執行緒問題困擾,這對於乙個苛求原理的我來說是種折磨,今天吃飯途中看了幾篇部落格,茅塞頓開。個人理解 redis分客戶端和服務端,一次完整的redis請求事件有多個階段 客戶端到伺服器的網路連線 redis讀寫事件發生 redis服務端的資料處理 單執行緒 資...
redis單執行緒模型
redis基於reactor模式開發了自己的網路事件處理器,稱之為檔案事件處理器 file event hanlder 檔案事件處理器由socket io多路復用程式 檔案事件分派器 dispather 事件處理器 handler 四部分組成。io多路復用程式會同時監聽多個socket,當被監聽的s...
redis單執行緒問題
1.redis的單執行緒指的是什麼單執行緒?同乙個時間點只處理乙個客戶端的連線,也就是redis網路模組的單執行緒。2.redis為什麼設計成單執行緒 具體作者怎麼想的,我不知道,我說一下我的理解 1 redis用的是非阻塞io,非阻塞i o本身就可以是單執行緒處理多個請求 2 如果用多執行緒,就要...