1.设置内存上限
使用maxmemory参数限制最大可用内存,当超出内存上限maxmemory时使用LRU等删除策略释放空间以及防止所用内存超过服务器物理内存。
2.配置内存回收策略
Redis使用内存达到maxmemory上限时会触发相应的回收策略。具体策略受maxmemory-policy参数控制,Redis支持6种策略,如下所示:
• noeviction:默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息(error)OOM command not allowed when used memory,此 时Redis只响应读操作。
• volatile-lru:根据LRU算法删除具有过期时间的键,直到腾出足够空间为止。如果没有可删除的键对象,回退到noeviction策略。
• allkeys-lru:根据LRU算法删除所有键, 直到腾出足够空间为止。
• allkeys-random:随机删除所有键,直到腾出足够空间为止。
• volatile-random:随机删除过期键,直到腾出足够空间为止。
• volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果 没有,回退到noeviction策略。
3.键值对优化
缩减键(key)和值(value)的长度,
-
key长度:在设计键时,在完整描述业务情况下,键值越短越好。
-
value长度:值对象缩减比较复杂,常见需求是把业务对象序列化成二进制数组放入Redis。首先应该在业务上精简业务对象,去掉不必要的属性避免存储无效数据。其次在序列化工具选择上,应该选择更高效的序列化工具来降低字节数组大小。以JAVA为例,内置的序列化方式无论从速度还是压缩比都不尽如人意,这时可以选择更高效的序列化工具,如: protostuff,kryo等
4.共享对象池
Redis内存维护一个[0-9999]的整数对象池,用于节约内存。 除了整数值对象,其他类型如list,hash,set,zset内部元素也可以使用整数对象池。因此开发中在满足需求的前提下,尽量使用整数对象以节省内存。
5.字符串优化
字符串对象是Redis内部最常用的数据类型。所有的键都是字符串类 型,值对象数据除了整数之外都使用字符串存储。在使用过程中应当尽量优先使用整数,比字符串类型更节省空间。
6.编码优化
Redis对外提供了多种数据类型,但是Redis内部对于不同类型的数据使用的内部编码不一样。内部编码不同将直接影响数据的内存占用和读写效率。
7.控制键的数量
当使用Redis存储大量数据时,通常会存在大量键,过多的键同样会消 耗大量内存。同一key,多个value时,使用hash代替string类型