為什么說redis的ziplist節約記憶體,看了他的資料結構,沒catch到他節約記憶體這個點啊。大神們指點一下。
uj5u.com熱心網友回復:
資料是壓縮后存盤在記憶體的,所以節約了記憶體。 但是增加了壓縮/解壓的開銷uj5u.com熱心網友回復:
除了頭和尾大部分都是資料,linkedlist是按照項最大的資料型別存的(每一個都是,為啥資料量大了變為linkedlist就不知道了)相對于dict來說更好維護吧(只是因為資料量大了查詢效率降低才變為dict)
uj5u.com熱心網友回復:
變為linkedlist是因為他的資料太緊湊了,導致增改操作需要大量記憶體支持吧uj5u.com熱心網友回復:
這個壓縮鏈表都在一塊連續的空間上創建,碎片化的空間小了,不久節約了uj5u.com熱心網友回復:
64位系統雙向鏈表一個節點prev和next指標就16位元組了,ziplist主要省的記憶體就在這兒了uj5u.com熱心網友回復:
typedef struct zlentry {unsigned int prevrawlensize, prevrawlen;
unsigned int lensize, len;
unsigned int headersize;
unsigned char encoding;
unsigned char* p;
} zlentry;
// 這是zlentry的結構體
樓主的疑惑點應該是從上述結構體來看,一個zlentry占據的空間相較雙向鏈表沒有更少反而更多。
但是,從原始碼來看,__ziplistInsert函式進行新節點插入時,并不存盤prevrawlensize/lensize,而在取節點時通過prerawlen/len去確定,再進行相應操作。
同時,在__ziplistInsert函式插入新節點時,會根據prerawlen/len的實際大小為這兩個值分配存盤空間。
// ziplist兩方面節省記憶體:
- 第一,之前的內容
- 第二,分配大塊記憶體減小記憶體碎片
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/87475.html
標籤:Java EE
