redis(6)壓縮列表

1、壓縮列表(ziplist) 是列表鍵和hash鍵的底層實現(xiàn)之一,當(dāng)列表建存儲小的整數(shù)值,或者長度較短的字符串redis就會使用壓縮列表,當(dāng)一個hash鍵值對,鍵和值要么是小整數(shù)值要么是長度較短的字符串,那么redis就會使用壓縮列表來底層實現(xiàn)

2、壓縮列表底層構(gòu)成


2.1、壓縮列表是為節(jié)約內(nèi)存開發(fā),是由一系列特殊編碼連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu),一個壓縮列表可以包含任意多個節(jié)點,每個節(jié)點保存一個字節(jié)數(shù)組或者一個整數(shù)值

2.2、zblbytes unit_32_t 4字節(jié),記錄整個壓縮列表占用內(nèi)存字節(jié)數(shù):在對壓縮列表進行內(nèi)存重分配,或者計算zlend的位置時使用

zltail unit_32_t 4字節(jié) 記錄壓縮列表表尾節(jié)點距離壓縮列表起始地址有多少字節(jié):通過這個偏移量,程序無須遍歷整個壓縮列表就能確定壓縮列表 尾節(jié)點的地址

zllen int_16 2字節(jié) 記錄壓縮列表節(jié)點數(shù)量,當(dāng)數(shù)值=65535時,依然要遍歷列表才能計算出來

entryX 列表節(jié)點 節(jié)點的長度由節(jié)點保存的內(nèi)容決定

zlend int_8 1字節(jié) 特殊值0xFF 十進制255,用于標(biāo)記壓縮列表末端

3、壓縮列表節(jié)點的構(gòu)成

3.1、每個壓縮列表節(jié)點可以保存一個字節(jié)數(shù)組或者一個整數(shù)值,字節(jié)數(shù)組以下三種長度的一種

長度小于等于63(2的6次方-1)字節(jié)的字節(jié)數(shù)組

長度小于等于16383(2的14次方-1)字節(jié)的字節(jié)數(shù)組

長度小于等于4294967295(2的32次方-1)字節(jié)的字節(jié)數(shù)組

整數(shù)值以下六中長度

4位長,0-12之間無符號整數(shù)

1字節(jié) 3字節(jié) int_16 int_32 int_64

每個壓縮列表由previous_entry_length encoding content三部分組成

3.2、previous_entry_length屬性以字節(jié)為單位,記錄前一個節(jié)點長度,比如前一個節(jié)點長度254,則屬性值字節(jié)長度1字節(jié),大于254,則為5字節(jié)其中屬性第一個字節(jié)為254,之后四字節(jié)用于保存前一個節(jié)點的長度,可以更加方便計算前一個節(jié)點的起始位置

3.3、encoding 記錄節(jié)點的content屬性所保存數(shù)據(jù)類型和長度

3.4、content 保存節(jié)點值,可以是一個字節(jié)數(shù)組或者整數(shù),值的類型和長度由節(jié)點的encoding屬性決定

4、連鎖更新,由于字節(jié)數(shù)變更,導(dǎo)致連續(xù)多次空間擴展操作稱為連續(xù)更新,添加或者刪除節(jié)點都可能引發(fā)連鎖更新,連鎖更新最壞情況下,需要n次空間重分配操作,每次空間分配最壞復(fù)雜度o(N)所以連鎖更新最壞復(fù)雜度o(n)

幾率很低

發(fā)生條件,多個連續(xù)的,長度結(jié)余250和253字節(jié)之間的節(jié)點,其次,即使出現(xiàn)連鎖更新,但是更新的節(jié)點數(shù)量不多,不會造成任何性能影響

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容