Redis實現原理簡介

2021-10-02 18:51:36 字數 2917 閱讀 6132

物件的實現

底層資料結構介紹

資料庫實現

資料庫示例

持久化實現

命令處理模型

複習單機伺服器的內部構造及原理介 紹

redis 資料的構建方法

物件系統

redis 是乙個鍵值對(key-value pair)資料庫,資料庫中的每個鍵都有與之對應的值,並且這些鍵和值都是物件(object),其中:

舉個例子,執行命令 set msg 「hello world」 會讓資料庫關聯起乙個新的鍵值對,其中鍵是乙個包含內容 「msg」 的字串物件,而值則是乙個包含內容 「hello world」 的字串物件;

物件關係圖

redis 實現不同型別物件的方法

物件的實現

redis 中的每種物件都有與之相對應的底層資料結構,並且為了讓物件在各種不同的應用場景下都有優

秀的效能表現,redis 為每種物件都提供了兩種型別的資料結構實現:

在建立新物件時,redis 會優先使用編碼資料結構來表示物件,並在有需要時,自動將物件的表示方式轉換為普通資料結構。

資料結構

編碼資料結構:

普通資料結構:

另外需要注意的是,節約記憶體並不是編碼資料結構所特有的 —— 普通資料結構也有相應的記憶體優化模式,比如 sds 就有兩種或以上的表示方式,不同的表示可以 讓同一物件在不同的使用場景下也盡可能地保持高效。

物件與資料結構之間的關係

壓縮列表、整數集合、sds、雙向列表、字典、跳躍表

壓縮列表

壓縮列表具有以下特點:

整數集合

整數集合具有以下特點:

sdsredis 使用 sds (****** dynamic string)而不是 c 語言的字串格式(以空字元 為結尾的字元陣列)來作為 redis 的預設字串表示,sds 具有以下特點:

雙向鍊錶

redis 的雙向鍊錶實現具有以下特性: 字典

redis 的字典實現具有以下特性:

跳躍表redis 的跳躍表實現具有以下特點:

redis 儲存鍵值對的方式

redis 資料庫的實現方法

在 redis 裡面,每個資料庫都是乙個字典,該字典的鍵和值都是我們之前提到的物件,其中:

因為資料庫就是字典,所以針對資料庫的操作都是基於字典操作來 實現的:

記錄過期時間

為了記錄資料庫鍵的過期時間,redis 為每個資料庫建立了另乙個字典,專門使用這個字典來記錄鍵的 過期時間,其中:

帶有過期時間的資料庫示例

rdb 持久化和 aof 持久化的實現原理

rdb 持久化實現原理

redis 會遍歷伺服器中的所有資料庫,訪問資料庫中的所有鍵值對,並根據鍵值對的型別,將這些鍵值對以及它們的過期時間寫入到 rdb 檔案裡面。

aof 持久化實現原理

aof 持久化功能在每次執行命令之後就將協議格式的命令寫入到 aof 緩衝區,然後伺服器再定期將緩衝區的內容寫入到 aof 檔案,還原資料時只要重新執行 aof 檔案裡面的命令即可。

aof 檔案重寫的實現原理

無須對現有的 aof 檔案進行處理,直接根據資料庫目前的狀態來生成新的 aof 檔案。

redis 處理命令請求的方法與模式

命令處理模型

redis 伺服器使用 reactor 模式來連線多個客戶端並處理命令請求,其中:

本節重點

redis 資料庫中的鍵和值都是物件,其中鍵總是乙個字串物件,而值則可以是多種型別物件的其中乙個。

redis 為每種物件都設定了兩種或以上的表示方式,使得 物件可以在不同的應用場景中都有最好的效能表現。

redis 的資料庫就是乙個字典,資料庫操作都是通過字典操作來實現的;除此之外,redis 還使用了另乙個字典來專門記錄鍵值對的過期時間。

rdb 持久化通過遍歷資料庫並將鍵值對寫入到檔案來實現,而 aof 持久化則通過記錄伺服器執行過的命令請求來實現。

redis 伺服器使用 reactor 模式來處理客戶端的命令請求。

因為 redis 的底層實現本身是乙個龐大的課題,所以這一節課只是簡單地介紹了 redis 伺服器關於單機資料庫方面的實現知 識。

至於redis 伺服器提供的其他功能(比如事 務、發布與訂閱、lua 指令碼)以及 redis 提供的多機功能(比如複製、 sentinel 和集群)的介紹則沒有涉及。

如果有興趣繼續了解這方面的知識的話,可以參考我寫的《redis 設計與實現》一書,裡面詳細介紹了 redis 幾乎全部功能的實現原理,應該會對有興趣了解這方面的同學一點幫助。

書本主頁: redisbook.com

malloc實現原理簡介

malloc 是c語言中動態儲存管理 的一組標準庫函式之一。其作用是在記憶體的動態儲存區中分配乙個長度為size的連續空間。其引數是乙個無符號整形數,返回值 是乙個指向所分配的連續儲存域的起始位址的指標。動態記憶體分配 就 是指在程式執行的過程中動態地分配或者 儲存空間的分配記憶體的方法。動態記憶體...

KVC實現原理簡介

kvc,全稱 key value coding。kvc運用了isa swizzling技術。isa swizzling就是型別混合指標機制。kvc主要通過isa swizzling來實現其內部定位查詢。isa指標 is a kind of 指向維護分發表的物件的類。該分發表實際上包含了指向實現類中的...

KVC實現原理簡介

kvc,全稱 key value coding。kvc運用了isa swizzling技術。isa swizzling就是型別混合指標機制。kvc主要通過isa swizzling來實現其內部定位查詢。isa指標 is a kind of 指向維護分發表的物件的類。該分發表實際上包含了指向實現類中的...