先来认识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内存两倍多。