最近在研究redis,稍微看了一下huanggz的《redis設計與實現》及原始碼中的相關實現,感覺作者對於redis確實有一定程式的了解,把問題說明很很清楚。本文算是對下午的學習的乙個記錄。
作為記憶體資料庫,由於其採用的c語言沒有內建相關的資料結構,redis自己實現了幾個底層的資料結構,具體包括如下:
1. 簡單動態字串
redis 沒有直接使用 c 語言傳統的字串表示(以空字元結尾的字元陣列,以下簡稱 c 字串), 而是自己構建了一種名為簡單動態字串(****** dynamic string,sds)的抽象型別, 並將 sds 用作 redis 的預設字串表示。
2. 雙端鍊錶
鍊錶提供了高效的節點重排能力, 以及順序性的節點訪問方式, 並且可以通過增刪節點來靈活地調整鍊錶的長度。作為一種常用資料結構, 鍊錶內建在很多高階的程式語言裡面, 因為 redis 使用的 c 語言並沒有內建這種資料結構, 所以 redis 構建了自己的鍊錶實現。
3. 字典
字典, 又稱符號表(symbol table)、關聯陣列(associative array)或者對映(map), 是一種用於儲存鍵值對(key-value pair)的抽象資料結構。
4. 跳躍表
跳躍表(skiplist)是一種有序資料結構, 它通過在每個節點中維持多個指向其他節點的指標, 從而達到快速訪問節點的目的。
跳躍表支援平均 o(\log n) 最壞 o(n) 複雜度的節點查詢, 還可以通過順序性操作來批量處理節點。
在大部分情況下, 跳躍表的效率可以和平衡樹相媲美, 並且因為跳躍表的實現比平衡樹要來得更為簡單, 所以有不少程式都使用跳躍表來代替平衡樹。
redis 使用跳躍表作為有序集合鍵的底層實現之一: 如果乙個有序集合包含的元素數量比較多, 又或者有序集合中元素的成員(member)是比較長的字串時, redis 就會使用跳躍表來作為有序集合鍵的底層實現。
5. 整數集合
整數集合(intset)是集合鍵的底層實現之一: 當乙個集合只包含整數值元素, 並且這個集合的元素數量不多時, redis 就會使用整數集合作為集合鍵的底層實現。
6. 壓縮列表
壓縮列表(ziplist)是列表鍵和雜湊鍵的底層實現之一。
當乙個列表鍵只包含少量列表項, 並且每個列表項要麼就是小整數值, 要麼就是長度比較短的字串, 那麼 redis 就會使用壓縮列表來做列表鍵的底層實現。
這幾個資料結構是redis的型別基礎,也是理解redis的命令的重要知識。儘管redis擁有了這麼多的adt,但是redis並沒有直接使用這些資料結構,而是構建了乙個物件系統,核心就是redisobject。
個人覺得作者是採用了物件導向的概念,用c語言實現多型,具體來說就是在redisobject這個類裡面設定了type與ptr這兩個域,其中type指定了物件的型別,而ptr則指向具體的資料。每當我們在redis資料庫新建乙個鍵值對時,我們至少會建立兩個物件:
1、鍵物件:鍵值對的鍵,字串型別
2、值物件:鍵值對的值,其型別根據需要確定。
redis總結包括5種物件,每個物件都由乙個redisobject結構表示。如下:
typedef struct redisobject robj;
感覺興趣的讀者可以自己去看一下這本書及源**。下面簡單記錄一下5物件可能採用的資料結構及一些有用的知識。
1、字串物件
字串物件的編碼可以是int、embstr及raw。
2、列表物件
列表物件的編碼可以是ziplist 或者linkedlist。
3、雜湊物件
雜湊物件的編碼可以是ziplist或者hashtable。
4、集合物件
集合物件的編碼可以是intset或者hashtable。
5、有序集合物件
有序集合物件的編碼可以是ziplist或者skiplist。
redis資料結構及編碼方式
edis有5種常用的資料結構 string hash list set zset,通過type key 命令可以檢視當前鍵的資料結構型別 每種資料結構都有不止一種相應的內部編碼實現,redis會在合適的場景選擇合適的內部編碼,通過object encoding key 可以檢視內部編碼。這樣設計的好...
Redis基本資料結構及底層實現
redis 所有值物件在內部都定義為 redisobject typedef struct redisobjectredis字串物件 sds struct sdshdr intset typedef struct intsetziplist type struct ziplist hashtable...
LinkedList相關知識及底層鍊錶實現原理
1 linkedlist集合實現了list介面,儲存元素特點是 有序且可重複,並且集合元素都有下標,從0開始以1遞增。2 linkedlist底層是以鍊錶為這種資料結構來儲存資料 3 linkedlist集合儲存元素優缺點 優點 由於底層是以鍊錶為資料結構,所以在增刪方面速度很快,也很方便 缺點 查...