Redis 資料結構與物件 壓縮列表

2021-09-09 07:59:40 字數 1506 閱讀 4425

壓縮列表是列表鍵和雜湊鍵的底層實現之一

當乙個列表鍵只包含少量列表項,並且每個列表要麼就是小整數值,要麼就是長度比較短的字串,那麼使用壓縮列表作為底層實現

當乙個雜湊鍵只包含少量鍵值對,而且每個鍵值對的鍵和值要麼是小整數值要是就是長度比較短的字串,那麼底層實現是壓縮列表

壓縮列表是redis為了節約記憶體而開發的,是一系列特殊編碼的連續記憶體塊組成的順序型資料結構,乙個壓縮列表可以包含任意多個節點,每個節點可儲存乙個位元組陣列或乙個整數值

屬性型別

長度用途

zlbytes

uint32_t

4位元組記錄壓縮列表的記憶體位元組數,對壓縮列表進行記憶體重分配或計算zlend時使用

zltail

uint32_t

4位元組記錄壓縮列表表尾節點距壓縮列表起始位址有多少位元組,程式無須遍歷整個壓縮列表即可確認表尾節點位址

zllen

uint16_t

2位元組記錄壓縮列表的節點數量,當屬性值小於uint16_max(65535)即節點數量,其他情況需遍歷才可計算出

entryx

列表節點

不定壓縮列表包含的各個節點

zlend

uint8_t

1位元組標記壓縮列表末端

因為壓縮列表是一塊記憶體,所以無法使用指標來確定entry,只能通過偏移量來確定entry,故zltail為尾節點的偏移量

壓縮節點

屬性用途

previous_entry_length

記錄壓縮列表前乙個節點的長度,壓縮列表從表尾向表頭遍歷由此屬性實現

encoding

記錄節點儲存資料型別和長度

content

負責儲存節點的值,可以是位元組陣列或整數

為什麼需要previous_entry_length?

首先通過zltail得到節點尾,然後通過該屬性則可以算出前乙個節點的起始位址

每個壓縮節點可以儲存乙個位元組陣列或乙個整數值

位元組陣列和整數都為範圍現在

一般來說位元組陣列長度小於2^32-1

整數可以是int64,32,16,3,1位元組長整數,4位長0-12無符號整數

previous_entry_length

如果前乙個節點長度小於254位元組,這個值長度為1位元組

如果前乙個節點長度大於254,這個值長度為5位元組

這就意味著,更新節點和新增節點的同時,有可能造成連鎖更新,例如10連續的節點都是253長度,突然前面新增乙個255長度的節點,那麼最前的節點previous_entry_length將變為5位元組,那麼總位元組長度》254,這樣該節點後面的節點都將更新,這將影響效率,所幸出現可能不多

encoding

1,2,5位元組長,值最高位00,01,10表示為位元組陣列

1位元組長,值最高位11開頭,表示整數

1111***x,這種無需content屬性,因為0-12可以在encoding種儲存

content

位元組陣列或整數

redis 資料結構與物件

簡單說下redis的資料結構,這些在網上也都有很詳細的解釋,redis 設計與實現 這本書基於redis3.0的,但是現在已經5.0 了,所以有些資料結構發生了變化,其中我自己實現發現了一部分,可能還有沒發現的。慢慢實踐吧 簡單動態字串是在c語音傳統的字串基礎上構建的,其資料結構為 struct s...

Redis資料結構與物件

redis使用五種型別物件實現實現鍵值對資料庫 字串 列表 雜湊 集合 有序集合 列表編碼 ziplist或linkedlist 雜湊編碼 ziplist或hashtable 集合編碼 intset或hashtable 有序集合編碼 ziplist或skiplist struct sdshdr 二進...

Redis資料結構與物件(二)

1 物件共享 如果redis中已經set了乙個字串或數字,再set同樣值,這時會實現物件引用共享。值物件的refcount會出現變化,增加。redis set a 100 ok redis set b 100 redis object refcount a integer 2 object refc...