上一節講redis的高效能字串結構sds,今天我們來看一下redis的hash物件。
ziplist(壓縮列表)
redis 的壓縮列表是一塊連續的記憶體空間,元素之間緊挨著儲存,沒有任何冗餘空間
原始碼
struct ziplist
/***entry物件原始碼
*/struct entry
壓縮列表是支援雙向遍歷,所以才會有zltail_offset這個欄位的,可以進行快速定位到最後乙個元素。然後倒序查詢(o(1))
prevlen 表示的是前乙個欄位的長度,有人就有疑問了,為什麼是前乙個entry的長度,為什麼不是自己的呢,其實他還有乙個作用是在壓縮列表倒敘遍歷的時候,需要通過這個欄位來快速定位到下乙個元素的位置,由於他是乙個連續的儲存空間,已經知道當前元素的位置+這個空間位址就可以確定寫乙個entry的位置。為什麼會這樣呢?因為entry的大小是不一樣的。如果是一樣的話就可以根據下表進行行為(個人理解,有錯誤還請指出),且prevlen 是乙個變長的整數,redis的常規操作,將不同長度使用不同的資料型別。節省記憶體
encoding的意思是元素的編碼型別,有了這個欄位就可以決定元素內容的設定,記憶體大小的分配。防止記憶體分配浪費的一種方式。具體內容檢視下面
1、00****** 最大長度位 63 的短字串,後面的 6 個位儲存字串的位數,剩餘的字
節就是字串的內容。
2、01****** ******xx 中等長度的字串,後面 14 個位來表示字串的長度,剩餘的
位元組就是字串的內容。
3、10000000 aaaaaaaa bbbbbbbb cccccccc dddddddd 特大字串,需要使用額外 4 個位元組
來表示長度。第乙個位元組字首是 10,剩餘 6 位沒有使用,統一置為零。後面跟著字串內
容。不過這樣的大字串是沒有機會使用的,壓縮列表通常只是用來儲存小資料的。
4、11000000 表示 int16,後跟兩個位元組表示整數。
5、11010000 表示 int32,後跟四個位元組表示整數。
6、11100000 表示 int64,後跟八個位元組表示整數。
7、11110000 表示 int24,後跟三個位元組表示整數。
8、11111110 表示 int8,後跟乙個位元組表示整數。
9、11111111 表示 ziplist 的結束,也就是 zlend 的值 0xff。
10、1111***x 表示極小整數,***x 的範圍只能是 (0001~1101), 也就是 1~13,因為
0000、1110、1111 都被占用了。讀取到的 value 需要將 ***x 減 1,也就是整數 0~12 就是
最終的 value。
之前有講到hash對像選用壓縮列表的兩個前提條件,其中之一是鍵值的大小都小於64,具體為什麼小於64和簡=鍵值對小於512就不具體說了,可以結合一下sds中的擴容方式思考一下,壓縮列表沒有冗餘空間,在進行擴容的時候會出現頻繁擴容,再加上占用空間大了後進行copy資料就很浪費效能了。所以當資料量大了後,就選擇了另一種資料結構那就是hashtable(字典)簡介
其字典的底層結構是使用的是redis 中dict。不僅是hash物件底層使用了dict,而且在redis全域性也是使用的是key-vlue結構,也就是字典的形式,還有zset的資料結構底層也是基於redis 中的dict結構。我們來看一下其原始碼:
// resdis 全域性使用的字典結構
struct redisdb
// 有序集合的底層資料結構
struct zset
2. dict結構深度解析/*
* 字典
* * 每個字典使用兩個雜湊表,用於實現漸進式 rehash
*/typedef struct dict dict;
struct dictentry
struct dictht
hash物件有兩種底層實現方式,hashtable(字典) 和 ziplist(壓縮鍊錶)
壓縮鍊錶由於是連續空間在剛開始資料量小的時候效能是顯著的,但是在資料量大的時候就會出現擴容慢的問題
字典通過雙hahstable的方式,再加上漸進式hash的方式解決了壓縮列表的擴容的問題
redis 高效能資料結構我們可以看到他在很對細節的把握很多,如不同的數字大小選用不同的字段型別,同乙個物件根據大小選擇不同的儲存型別。(節省記憶體)
Redis高效能資料庫
redis高效能資料庫 redis 本質上是乙個非關係型資料庫,採用鍵值的方式記錄資料,由於其獨特的執行模式和資料儲存模式,在作用上通常可以用來當做關係型資料庫的快取來使用,從而提高資料查詢效率 redis最大特點 執行速度很快 原因 1 redis使用c語言開發,和作業系統的相容性更強,執行效率更...
redis之資料結構 上
1.redis之key value對 key 在儲存redis記憶體中的資料起的變數名字 value value 的型別可以是string,list,set,sort set,hash.一般情況 key的命名規則是 鍵盤除了空格 換行外其他的大部分字元都可以使用。建議key不要太長,佔記憶體,也不要...
redis資料結構之字典
字典 dictionary 其實和符號表 symbol table 關聯陣列 associative array 對映 map 是乙個東東,都是為了儲存鍵值對 k v pair 的資料結構,屌屌噠。php中因為能很方便的用關聯陣列,因此能寫出很多實用高效的 有空一定要去好好了解下php的關聯陣列是如...