Redis常見五種資料結構及底層實現原理

2021-10-08 23:58:09 字數 2182 閱讀 3832

二、redis五種資料結構底層實現原理

6、hashtable編碼方式

7、intset編碼方式

8、skiplist編碼方式

string 型別是 redis 最基本的資料型別,string 型別的值最大能儲存 512mb。

redis hash 是乙個 string 型別的 field 和 value 的對映表,每個 hash 可以儲存 232 -1 鍵值對(40多億)。

redis 列表是簡單的字串列表,按照插入順序排序。你可以新增乙個元素到列表的頭部(左邊)或者尾部(右邊)。

redis的set是string型別的無序集合。

集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是o(1)。

redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。不同的是每個元素都會關聯乙個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重複。

string儲存整數值時使用int編碼方式,那麼整數值就儲存在ptr中。

redisobject的記憶體位址和sds【簡單動態字串】的記憶體位址是連續的。

embstr建立字串只會一次;釋放記憶體的函式也是一次;訪問速度比較快。

raw建立字串要兩次(redisobject和sfs分開);釋放記憶體的函式也是兩次。

優點是節省記憶體,缺點是比其他結構消耗更多的時間。

zlbytes:記錄整個壓縮列表占用的記憶體位元組數

zltail:記錄壓縮列表表尾節點距離壓縮列表的起始位址多少位元組

zllen:記錄包含的節點數

zlend:特殊值0xff,表示尾部。

ziplist編碼方式,每個節點是「len+data」格式,這樣遍歷每個節點時,就知道下個節點在記憶體的位置。

每個節點是「key-value」前後緊挨著儲存。

分數小的靠近表頭。

底層用字典實現,字典每個鍵是字串物件,值為null。

set儲存少於512,且資料都是整數。

由字典dict和跳表構成。

字典dict用於根據字串物件查分數。

跳表可以根據分數查詢對應的字串。

字典dict是無序的,時間複雜度o(1);跳表是有序的,時間複雜度o(logn);

雖然有了兩個結構,但元素成員和分值共享。

是根據字串查詢分數。

傳統跳表

有序的單鏈表+多級索引,構成跳躍表。

每個結點不僅包含指向下乙個結點的指標,而且包含多個指向後續結點的指標。「多個」是隨機函式生成器生成。概率均衡技術更高效。

redis的跳躍表

redis中分數是可以重複的,但分數相同的,在按照字串的字典順序排序;

第一層鍊錶不是單向鍊錶,而是雙向鍊錶,方便倒序方式獲取乙個範圍內的元素;

【下面的圖不想畫了,網上直接借用】

Redis五種資料結構

redis除了儲存鍵之外還可以儲存常見的5種資料型別,分別是 string list set zset hash。結構型別 結構儲存的值 結構的讀寫能力 string字串 可以是字串 整數或浮點數 對整個字串或字串的一部分進行操作 對整數或浮點數進行自增或自減操作 list列表 乙個鍊錶,鍊錶上的每...

Redis五種資料結構

對redis來說,所有的key 鍵 都是字串,所謂的5種資料結構是指針對value而言 資料結構型別 說明使用場景 常用方法 其他鏈結 string字串型別1 redis中最基本的資料型別,乙個key對應乙個value。2 是二進位制安全的,意思是 redis 的 string 可以包含任何資料。如...

Redis五種資料結構及基本操作

redis基礎語法redis五種資料結構 1.字串型別 string 2.雜湊型別 hash map格式 3.列表型別 list linkedlist格式,支援重複元素 4.集合型別 set 不允許重複元素 5.有序集合型別 sortedset 不允許重複元素,且元素有順序 字串型別string 儲...