Redis底層結構之壓縮列表
阿新 • • 發佈:2020-12-13
技術標籤:Redis
文章目錄
是什麼
壓縮列表是一塊連續的記憶體空間,zset、hash容器在元素物件較少的時候,採用壓縮列表。
struct ziplist<T>{
int32 zlbytes;//整個壓縮列表佔用位元組數
int32 zltail_offset://最後一個元素距離壓縮列表起始位置的偏移量,用於倒著遍歷
int16 zllength://元素個數
T[] extries://元素內容列表,連續儲存
int8 zlend://標誌壓縮列表的結束
}
struct entry{
int<var> prevlen; //前一個entry的位元組長度,壓縮連結串列倒著遍歷的時候,需要通過這個元素快速定位到下一個元素
int<var> encoding;//元素型別編碼
optional byte[] content;//元素內容
}
增加元素
因為ziplist是緊湊儲存,插入一個新元素,需要realloc擴充套件記憶體,會重新分配記憶體空間,將內容進行拷貝
如果ziplist佔用記憶體太大,重新分配記憶體和拷貝記憶體機會有很大的消耗。
不適合儲存大型字串,儲存的元素也不宜過多
存在級連更新的問題
IntSet集合
當set集合元素容納的元素都是整數且元素個數較小時,Redis會採用intset來儲存結合元素。intset是緊湊的陣列結構,支援16位,32位,64位整數
struct intset<T>{
int32 encoding://決定整數位寬是16位、32位、還是64位
int32 length;//元素個數
int<T> contents;//整數陣列,可以是16位、32位、還是64位
}