先來認識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內存兩倍多。