经常使用内存优化手段与参数redis
redis的性能如何是彻底依赖于内存的,因此咱们须要知道如何来控制和节省内存。性能
首先最重要的一点是不要开启Redis的VM选项,即虚拟内存功能,这个原本是做为Redis存储超出物理内存数据的一种数据在内存与磁盘换入换出的一个持久化策略,可是其内存管理成本很是的高,因此要关闭VM功能,请检查你的redis.conf文件中 vm-enabled 为 no。优化
其次最好设置下redis.conf中的maxmemory选项,该选项是告诉Redis当使用了多少物理内存后就开始拒绝后续的写入请求,该参数能很好的保护好你的Redis不会由于使用了过多的物理内存而致使swap,最终严重影响性能甚至崩溃。spa
另外Redis为不一样数据类型分别提供了一组参数来控制内存使用,咱们知道Redis Hash是value内部为一个HashMap,若是该Map的成员数比较少,则会采用相似一维线性的紧凑格式来存储该Map, 即省去了大量指针的内存开销,这个参数控制对应在redis.conf配置文件中下面2项:指针
hash-max-zipmap-entries 64
hash-max-zipmap-value 512 对象
1· 含义是当value这个Map内部不超过多少个成员时会采用线性紧凑格式存储,就至关于Map里面存Map,默认是64,即value内部有 64个如下的成员就是使用线性紧凑存储,超过该值自动转成真正的HashMap。ip
2· hash-max-zipmap-value 含义是当 value这个Map内部的每一个成员值长度不超过多少字节就会采用线 性紧凑存储来节省空间。内存
以上2个条件任意一个条件超过设置值都会转换成真正的HashMap,也就不会再节省内存了,那么这个值是否是设置的越大越好呢,答案固然是否认的,
HashMap的优点就是查找和操做的时间复杂度都是O(1)的,而放弃Hash采用一维存储则是O(n)的时间复杂度,若是成员数量不多,则影响不大,不然会严重影响性能,因此要权衡好这个值的设置,整体上仍是最根本的时间成本和空间成本上的权衡。hash
一样相似的参数还有:内存管理
list-max-ziplist-entries 512
说明:list数据类型多少节点如下会采用去指针的紧凑存储格式。
list-max-ziplist-value 64
说明:list数据类型节点值大小小于多少字节会采用紧凑存储格式。
set-max-intset-entries 512
说明:set数据类型内部数据若是所有是数值型,且包含多少节点如下会采用紧凑格式存储。
Redis内部实现没有对内存分配方面作过多的优化,在必定程度上会存在内存碎片,不过大多数状况下这个不会成为Redis的性能瓶颈, 不过若是在Redis内部存储的大部分数据是数值型的话,Redis内部采用了一个shared integer的方式来省去分配内存的开销, 即在系统启动时先分配一个从1~n 那么多个数值对象放在一个池子中,若是存储的数据刚好是这个数值范围内的数据,则直接从池子里取出该对象, 而且经过引用计数的方式来共享,这样在系统存储了大量数值下,也能必定程度上节省内存而且提升性能, 这个参数值n的设置须要修改源代码中的一行宏定义REDIS_SHARED_INTEGERS,该值默认是10000,能够根据本身的须要进行修改,修改后从新编译就能够了。