Redis系統架構中各個處理模塊是干什么的?no.19

Redis 系統架構

通過前面的學習,相信你已經掌握了 Redis 的原理、數據類型及訪問協議等內容。本課時,我將進一步分析 Redis 的系統架構,重點講解 Redis 系統架構的事件處理機制、數據管理、功能擴展、系統擴展等內容。

事件處理機制

Redis 組件的系統架構如圖所示,主要包括事件處理、數據存儲及管理、用于系統擴展的主從復制/集群管理,以及為插件化功能擴展的 Module System 模塊。

在這里插入圖片描述
Redis 中的事件處理模塊,采用的是作者自己開發的 ae 事件驅動模型,可以進行高效的網絡 IO 讀寫、命令執行,以及時間事件處理。

其中,網絡 IO 讀寫處理采用的是 IO 多路復用技術,通過對 evport、epoll、kqueue、select 等進行封裝,同時監聽多個 socket,并根據 socket 目前執行的任務,來為 socket 關聯不同的事件處理器。

當監聽端口對應的 socket 收到連接請求后,就會創建一個 client 結構,通過 client 結構來對連接狀態進行管理。在請求進入時,將請求命令讀取緩沖并進行解析,并存入到 client 的參數列表。

然后根據請求命令找到 對應的redisCommand ,最后根據命令協議,對請求參數進一步的解析、校驗并執行。Redis 中時間事件比較簡單,目前主要是執行 serverCron,來做一些統計更新、過期 key 清理、AOF 及 RDB 持久化等輔助操作。

數據管理

Redis 的內存數據都存在 redisDB 中。Redis 支持多 DB,每個 DB 都對應一個 redisDB 結構。Redis 的 8 種數據類型,每種數據類型都采用一種或多種內部數據結構進行存儲。同時這些內部數據結構及數據相關的輔助信息,都以 kye/value 的格式存在 redisDB 中的各個 dict 字典中。

數據在寫入 redisDB 后,這些執行的寫指令還會及時追加到 AOF 中,追加的方式是先實時寫入AOF 緩沖,然后按策略刷緩沖數據到文件。由于 AOF 記錄每個寫操作,所以一個 key 的大量中間狀態也會呈現在 AOF 中,導致 AOF 冗余信息過多,因此 Redis 還設計了一個 RDB 快照操作,可以通過定期將內存里所有的數據快照落地到 RDB 文件,來以最簡潔的方式記錄 Redis 的所有內存數據。

Redis 進行數據讀寫的核心處理線程是單線程模型,為了保持整個系統的高性能,必須避免任何kennel 導致阻塞的操作。為此,Redis 增加了 BIO 線程,來處理容易導致阻塞的文件 close、fsync 等操作,確保系統處理的性能和穩定性。

在 server 端,存儲內存永遠是昂貴且短缺的,Redis 中,過期的 key 需要及時清理,不活躍的 key 在內存不足時也可能需要進行淘汰。為此,Redis 設計了 8 種淘汰策略,借助新引入的 eviction pool,進行高效的 key 淘汰和內存回收。

功能擴展

Redis 在 4.0 版本之后引入了 Module System 模塊,可以方便使用者,在不修改核心功能的同時,進行插件化功能開發。使用者可以將新的 feature 封裝成動態鏈接庫,Redis 可以在啟動時加載,也可以在運行過程中隨時按需加載和啟用。

在擴展模塊中,開發者可以通過 RedisModule_init 初始化新模塊,用 RedisModule_CreateCommand 擴展各種新模塊指令,以可插拔的方式為 Redis 引入新的數據結構和訪問命令。

系統擴展

Redis作者在架構設計中對系統的擴展也傾注了大量關注。在主從復制功能中,psyn 在不斷的優化,不僅在 slave 閃斷重連后可以進行增量復制,而且在 slave 通過主從切換成為 master 后,其他 slave 仍然可以與新晉升的 master 進行增量復制,另外,其他一些場景,如 slave 重啟后,也可以進行增量復制,大大提升了主從復制的可用性。使用者可以更方便的使用主從復制,進行業務數據的讀寫分離,大幅提升 Redis 系統的穩定讀寫能力。

通過主從復制可以較好的解決 Redis 的單機讀寫問題,但所有寫操作都集中在 master 服務器,很容易達到 Redis 的寫上限,同時 Redis 的主從節點都保存了業務的所有數據,隨著業務發展,很容易出現內存不夠用的問題。

為此,Redis 分區無法避免。雖然業界大多采用在 client 和 proxy 端分區,但 Redis 自己也早早推出了 cluster 功能,并不斷進行優化。Redis cluster 預先設定了 16384 個 slot 槽,在 Redis 集群啟動時,通過手動或自動將這些 slot 分配到不同服務節點上。在進行 key 讀寫定位時,首先對 key 做 hash,并將 hash 值對 16383 ,做 按位與運算,確認 slot,然后確認服務節點,最后再對 對應的 Redis 節點,進行常規讀寫。如果 client 發送到錯誤的 Redis 分片,Redis 會發送重定向回復。如果業務數據大量增加,Redis 集群可以通過數據遷移,來進行在線擴容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14208.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

API-BigInteger、BigDecimal

BigInteger: demo1: package BigInteger;import java.math.BigInteger; import java.util.Random;public class demo1 {public static void main(String[] args) {//獲取一個隨機最大整數BigInteger bd1 new BigInteger(5, new Random());System.out.println(bd1…

SSMP整合案例第一步 制作分析模塊創建與開發業務實體類

制作分析 我們要實現一個模塊的增刪改查 實際開發中mybatisplus用的不多,他只能對沒有外鍵的單表進行簡單的查詢 但在這個案例中我們還是選擇mybatisplus開發 模塊創建 我們把所有服務器都放在一起 就不用前后端分離 我們嘗試用后端開發進行全棧開發 新建項目添…

macos brew安裝多版本protobuf,切換指定版本protobuf 為默認版本方法

protobuf 不同的版本語法相差很大, 而在不同的項目中可能使用的protobuf版本也不同,所以我們的電腦就可能需要安裝多個版本的protobuf, 下面介紹macos下如何通過brew安裝多版本和設置想要的默認版本的方法 安裝,則可以先執行 bre…

Thinkphp3.2.3網站后臺不能訪問如何修復

我是使用Thinkphp3.2.3新搭建的PHP網站,但是網站前臺可以訪問,后臺訪問出現如圖錯誤: 由于我使用的Hostease的Linux虛擬主機產品默認帶普通用戶權限的cPanel面板,對于上述出現的問題不清楚如何處理,因此聯系Hostease的…

(3)醫療圖像處理:MRI磁共振成像-快速采集--(楊正漢)

目錄 一、磁共振快速采集技術基礎 1.K空間的基本特點 2.快速成像的理由: 3.快速成像的硬件要求: 二、磁共振快速采集技術 1.采集更少的相位編碼線 2.平行采集技術PAT 3.其他與快速采集有關的技術 1)部分回波技術 2)頻率…

java實現一個動態監控系統,監控接口請求超時的趨勢

目錄 整體思路案例實現1. 數據收集2. 數據聚合3. 趨勢分析4. 異常檢測5. 異常處理定時任務 整體思路 理想情況下,你可以實現一個簡單的動態監控算法來檢測渠道請求的響應時間趨勢,并在發現頻繁超時的情況下進行處理。以下是一個可能的算法框架&#xff…

Oracle表關聯更新幾種方法

1、測試表及數據準備 create table T_update01(ID int ,infoname varchar2(32),sys_guid varchar2(36)); create table T_update02(ID int ,infoname varchar2(32),sys_guid varchar2(36));insert into T_update01 select 1,N1_updateName,sys_guid() from dual union select …

java如何獲取IP和IP的歸屬地?

在Java中,獲取IP地址通常指的是獲取本地機器的IP地址或者通過某種方式(如HTTP請求)獲取的遠程IP地址。代碼案例如下: 而要獲取IP的歸屬地(地理位置信息),則通常需要使用第三方IP地址查詢服務,我…

c++ 排序算法merge使用要求

在C中&#xff0c;std::merge是一個算法&#xff0c;它用于合并兩個已排序的范圍&#xff08;例如數組或容器中的一部分&#xff09;到一個新的范圍中。這個函數在<algorithm>頭文件中定義。 輸入范圍必須已排序 std::merge要求輸入的兩個范圍都必須是已排序的&#xf…

23種設計模式順口溜

口訣&#xff1a; 原型 抽風 &#xff0c;單獨 建造 工廠 &#xff08;寓意&#xff1a;&#xff08;這里代指本來很簡單的東西&#xff0c;卻要干工廠這里復雜的業務&#xff09; 抽風&#xff1a;抽象工廠單獨&#xff1a;單例橋代理組合享元適配器&#xff0c;&#xff0…

Microsoft VBA Excel 去重小工具

問題簡述 在本工作表中&#xff0c;A1:B3單元格樣式如下&#xff0c;通過名稱管理器B列的單元格被命名為"LinkFile"、“SheetName”、“InputArea”&#xff0c;請實現以下功能&#xff1a;讀取Excel文件中的數據&#xff0c;去除重復的數據&#xff0c;并記錄每個數…

亞馬遜云科技介紹

&#x1f525;博客主頁&#xff1a; 小羊失眠啦. &#x1f3a5;系列專欄&#xff1a;《C語言》 《數據結構》 《C》 《Linux》 ??感謝大家點贊&#x1f44d;收藏?評論?? 文章目錄 一、亞馬遜云科技云計算1.1 云計算的優勢 二、領先的云平臺三、亞馬遜云科技區域的全球網絡…

最簡單的,在mac筆記本上安裝Unix-v6系統,進行“Unix內核源碼剖析”

Unix V6 已經是 1975 年的系統了&#xff0c;但是其源代碼攏共只有 1w 行左右&#xff0c;并且使用了 C 語言&#xff08;K & R 之前的標準&#xff09;&#xff0c;還是現代操作系統的鼻祖&#xff0c;所以說是初學者最好的研究對象。 安裝模擬器 brew install simh …

【MySQL精通之路】SQL優化(1)-查詢優化(3)-索引合并

主博客&#xff1a; 【MySQL精通之路】SQL優化(1)-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL優化(1)-查詢優化(2)-范圍查詢優化-CSDN博客 下一篇&#xff1a; 目錄 1.索引合并-交集訪問算法 2.索引合并聯合訪問算法 3.索引合并-排序聯合訪問算法 4.影響索引合…

平衡發展與環保:理性看待地下式污水處理廠建設|中聯環保圈

這些年啊&#xff0c;隨著城市化進程越來越快&#xff0c;還有環境保護意識不斷提高&#xff0c;這地下式污水處理廠慢慢就成了熱門的建設趨勢了。據相關統計&#xff0c;全球現在運行著 200 多座地下式污水處理廠呢&#xff0c;咱國家建成和在建的數量也差不多快到 200 座啦。…

基于transformers框架實踐Bert系列4-文本相似度

本系列用于Bert模型實踐實際場景&#xff0c;分別包括分類器、命名實體識別、選擇題、文本摘要等等。&#xff08;關于Bert的結構和詳細這里就不做講解&#xff0c;但了解Bert的基本結構是做實踐的基礎&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

STM32入門筆記(02):USART串口通信注意事項筆記(SPL庫函數版)

這是通過串口通信發送過來的數據&#xff0c;里面包括了故障碼&#xff0c;電壓&#xff0c;電流&#xff0c;頻率等信息&#xff0c;請你用STM32f103系列單片機的串口1讀取該數據并解析出電壓和電流是多少&#xff1f; 要用STM32F103系列單片機的串口1讀取并解析發電機上的逆…

【Django項目】 音樂網站spotify復刻

代碼&#xff1a;https://github.com/tomitokko/spotify-clone 注&#xff1a;該項目不是自己提供mp3文件&#xff0c;而是使用spotify 的api接口獲取。