Redis Hash是value内部为一个HashMap,如果该Map的成员数比较少,则会采用类似一维线性的紧凑格式来存储该Map,即省去了大量指针的内存开销,这个参数控制对应在redis.conf配置文件中下面2项:
-
hash-max-zipmap-entries 512: 当value这个Map内部不超过多少个成员时会采用线性紧凑格式存储,默认是512,即value内部有512个以下的成员就是使用线性紧凑存储,超过该值自动转成真正的HashMap。
-
hash-max-zipmap-value: 当 value这个Map内部的每个成员值(任意元素的Key/Value)长度不超过多少字节就会采用线性紧凑存储来节省空间。
以上2个条件任意一个条件超过设置值都会转换成真正的HashMap,也就不会再节省内存了,那么这个值是不是设置的越大越好呢?答案当然是否定的,HashMap的优势就是查找和操作的时间复杂度都是O(1)的,而放弃Hash采用一维存储则是O(n)的时间复杂度,如果成员数量很少,则影响不大,否则会严重影响性能,所以要权衡好这个值的设置,总体上还是最根本的时间成本和空间成本上的权衡。