redis內存優化方法

先來認識2個redis配置參數redis

hash-max-ziplist-entries : hash內部編碼壓縮列表的最大值,默認512數組

hash-max-zipmap-value : hash內部編碼壓縮列表單個key的最大值,默認64字節。服務器

這是hash的配置,list,set,zset也有相似的配置參數。優化

 

 

先說結論:總結redis節約內存的方法。編碼

 

1,使用對象共享池優化小整數對象。spa

2,數據優先使用整數,比字符串更節省空間。對象

3,操做優化。儘可能避免字符串的追加操做,由於字符串存在預分配機制。追加操做後字符串對象會分配一倍的容量做爲於預留空間。ip

4,編碼優化。list,hash,set,zset儘量使用ziplist編碼。好處是內存降低,壞處是操做變慢。通常大小不超過1000。內存

5,控制鍵的數量,100萬idfa映射到1000個hash中,每一個hash保存1000個元素。由於一樣的數據使用ziplist編碼比存儲string類型節約空間。字符串

 

緣由:

1,ziplist的內部表現是盡愁排列的一塊連續內存數組。hashtable不是,佔內存更多。

2,一樣的數據使用ziplist編碼的hash存儲比string類型節約內存。

 

 

實驗驗證================

 

服務器redis參數配置:

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

 

=============================

驗證一:驗證hastable和ziplist編碼的內存差別。

1,200個hash,每一個500個field,value

fied  value

000001 124F9D54-D107-4F7D-ABAF-E37DB7F1712E

操做前redis大小:

used_memory:1839072

used_memory_human:1.75M

 

寫入200個ziplist編碼的hash操做後。

used_memory:6772320

used_memory_human:6.46M

內存大小:4.71M

 

2,100000個idfa用hashtable編碼存成1個hash。

操做後

used_memory:21137248

used_memory_human:20.16M

內存大小13.7M

 

結論:編碼優化能夠顯著下降內存。使用hashtable佔內存是ziplist的三倍。

 

===========================

驗證2,控制鍵的個數來下降內存。

10萬個idfa存成string格式。

# Memory

used_memory:33383776

used_memory_human:31.84M

內存大小11.68M

結論:相同數量的string是ziplist編碼的hash內存兩倍多。

相關文章
相關標籤/搜索