Redis 資料結構之 壓縮列表

2021-10-08 04:15:22 字數 709 閱讀 2956

壓縮列表是一塊連續的記憶體空間,元素之間緊挨著儲存,沒有任何冗餘空隙。

struct ziplist 

entry 塊隨著容納的元素型別不同,也會有不一樣的結構。

struct entry  

encoding 字段儲存了元素內容的編碼型別資訊,ziplist 通過這個欄位來決定後面的 content 內容的形式。 redis 為了節約儲存空間,對 encoding 字段進行了相當複雜的設計。redis 通過這個欄位的字首位來識別具體儲存的資料形式。下面我們來看看 redis 是如何根據 encoding 的字首位來區分內容的:  

因為 ziplist 都是緊湊儲存,沒有冗餘空間 (對比一下 redis 的字串結構)。意味著插入乙個新的元素就需要呼叫 realloc 擴充套件記憶體。取決於記憶體分配器演算法和當前的 ziplist 記憶體大小,realloc 可能會重新分配新的記憶體空間,並將之前的內容一次性拷貝到新的位址,也可能在原有的位址上進行擴充套件,這時就不需要進行舊內容的記憶體拷貝。 如果 ziplist 佔據記憶體太大,重新分配記憶體和拷貝記憶體就會有很大的消耗。所以 ziplist 不適合儲存大型字串,儲存的元素也不宜過多。 

redis資料結構 壓縮列表

但凡是名稱中有 壓縮 兩個字的,都是為了節約記憶體。壓縮列表也不例外。以下是壓縮列表的結構圖 zlbytes zltail zllen entry1 entry2 entryn zlend 說明 屬性 型別長度 用途zlbytes unit32 t 4bit 記錄整個ziplist占用的記憶體位元組...

Redis資料結構 壓縮列表

同整數集合一樣壓縮列表也不是基礎資料結構,而是 redis 自己設計的一種資料儲存結構。它有點兒類似陣列,通過一片連續的記憶體空間,來儲存資料。不過,它跟陣列不同的一點是,它允許儲存的資料大小不同。聽到 壓縮 兩個字,直觀的反應就是節省記憶體。之所以說這種儲存結構節省記憶體,是相較於陣列的儲存思路而...

redis資料結構 壓縮列表

壓縮列表是 redis 為了節約記憶體而開發的。乙個壓縮列表可以包含任意多個節點,每個節點可以儲存乙個位元組陣列或者乙個整數值。當乙個列表鍵只包含少量列表項,並且每個列表項要麼就是小整數值,要麼就是長度比較短的字串,那麼 redis 就會使用壓縮列表來做列表鍵的底層實現。在乙個壓縮列表中,有多個連續...