redis之maxmemory与maxmemory-policy

redis maxmemory and maxmemory-policy

Posted by alovn on December 9, 2019

maxmemory

redis.conf中的 maxmemory 定义redis最大可占用物理内存。maxmemory是bytes字节类型,注意转换。配置也有多种书写方式,以下均为合法:

1
2
3
4
5
6
7
8
maxmemory 1048576
maxmemory 1048576B
maxmemory 1000KB
maxmemory 100MB
maxmemory 1GB
maxmemory 1000K
maxmemory 100M
maxmemory 1G

没有带单位结尾的为字节数,以B结尾的表示相应的大小。但需要注意KB和K、MB和M、GB和G是不同的,如1K表示1000字节,而1KB则为1024字节。如果maxmemory值为0,表示不做限制。

注意:在32位系统下,maxmemory不能超过3GB,建议使用64位系统。如果是32位系统,当maxmemory值为0时,redis启动时也会记录WARN日志, 并强制将最大内存设置为3GB,同时将内存策略设置为MAXMEMORY_NO_EVICTION(超出maxmemory后,所有写操作失败,读操作成功):

1
Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.

一般推荐Redis设置内存为最大物理内存的四分之三。

maxmemory policy

如果redis配置了maxmemory和maxmemory-policy策略,则当redis内存数据达到maxmemory时,会根据maxmemory-policy配置来淘汰内存数据,以避免OOM。 redis提供了以下6种淘汰策略:

1
2
3
4
5
6
1. noeviction:不执行任何淘汰策略,当达到内存限制的时候客户端执行命令会报错。
2. allkeys-lru:从所有数据范围内查找到最近最少使用的数据进行淘汰,直到有足够的内存来存放新数据。
3. volatile-lru:从所有的最近最少访问数据范围内查找设置到过期时间的数据进行淘汰,如果查找不到数据,则回退到noeviction。
4. allkeys-random:从所有数据范围内随机选择key进行删除。
5. volatile-random:从设置了过期时间的数据范围内随机选择key进行删除。
6. volatile-ttl:从设置了过期时间的数据范围内优先选择设置了TTL的key进行删除。

我在生产中将 maxmemory-policy 设置为了 volatile-lru,当内存不够用时,会把访问最少的数据淘汰掉。当然也要考虑使用场景。