Redis 小物件壓縮

2021-09-05 13:01:22 字數 1646 閱讀 8878

redis 是乙個非常耗費記憶體的資料庫,它所有的資料都放在記憶體裡。如果我們不注意節約使用記憶體,redis 就會因為我們的無節制使用出現記憶體不足而崩潰。

1、ziplist:是乙個緊湊的位元組陣列結構,每個元素直接都是緊挨著,資料結構如下圖:

1)object encoding +key :查詢key屬於哪種型別

2)若存放hash結構,key和value會作為倆個entry相鄰存在一起

2、intset;是乙個緊湊的整數陣列結構,它用於存放元素都是整數的並且元素個數較少的 set 集合

1)整數可以動態擴容大小,由uint16到uint32、uint64,儲存的資料不夠後自動往大擴容,如下圖所示:

3、儲存界限:當集合物件的元素不斷增加,或者某個 value 值過大,這種小物件儲存也會被公升級為標準結構:

1)hash-max-ziplist-entries 512 # hash 的元素個數超過 512 就必須用標準結構儲存 

2)hash-max-ziplist-value 64 # hash 的任意元素的 key/value 的長度超過 64 就必須用標準結構儲存 

3)list-max-ziplist-entries 512 # list 的元素個數超過 512 就必須用標準結構儲存

4) list-max-ziplist-value 64 # list 的任意元素的長度超過 64 就必須用標準結構儲存

5) zset-max-ziplist-entries 128 # zset 的元素個數超過 128 就必須用標準結構儲存 

6)zset-max-ziplist-value 64 # zset 的任意元素的長度超過 64 就必須用標準結構儲存 

7)set-max-intset-entries 512 # set 的整數元素個數超過 512 就必須用標準結構儲存

例如下圖所示:

4、記憶體**機制

1)redis並不總是可以將空閒的記憶體立即歸還給作業系統,因為作業系統**記憶體是以頁為單位,如果這個頁只要有乙個key還在使用,那麼就不能立刻被**

3)flushdb:執行該命令,會使所有的key都乾掉了,大部分之間使用的頁面都完全乾淨了

5、記憶體分配演算法

1)redis將記憶體分配的細節丟給了第三方記憶體分配庫去實現,目前redis使用jemalloc(facebook) 庫來管理記憶體,也可以切換到tcmalloc(google),但是jemalloc 相比 tcmalloc的效能要稍好一些,例如下圖檢視記憶體管理:

Redis儲存優化 小物件壓縮

小物件壓縮 32bit vs 64bit 小物件壓縮 public class arraymap keys.add k values.add v return null public v get k k return null public v delete k k return null 新doc...

Redis小物件的壓縮儲存

redis hash是value內部為乙個hashmap,如果該map的成員數比較少,則會採用類似一維線性的緊湊格式來儲存該map,即省去了大量指標的記憶體開銷,這個引數控制對應在redis.conf配置檔案中下面2項 以上2個條件任意乙個條件超過設定值都會轉換成真正的hashmap,也就不會再節省...

小物件壓縮

鑑於redis是純記憶體資料庫,為了盡可能的節省記憶體開銷避免因為記憶體不足而崩潰,redis對一部分資料結構進行了優化。編譯 如果使用32位進行編譯,內部所有資料結構所使用的指標空間占用會少一半,如果使用記憶體不超過4g,可以考慮使用32位進行編譯,如果不足還可以通過增加例項的方式來解決。壓縮 這...