Redis内存淘汰

227 阅读3分钟

内存上限

在Redis中,可以通过maxmemory参数来限制最大可用内存,主要为了避免Redis内存无限接近操作系统内存,从而导致服务器响应变慢或者宕机。当内存达到maxmemory后,Redis会根据maxmemory-policy参数设置的内存淘汰策略来淘汰内存。

Redis参数可以通过redis.conf配置文件或者命令行设置。

通过config set maxmemory命令来设置maxmemory参数:

127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379> config set maxmemory 100MB
OK
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "104857600"

maxmemory有多种书写方式,以下均合法:

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,表示不做内存限制。

maxmemory参数限制的是Redis的对象内存大小,由于内存碎片的存在,所以Redis服务器实际占用的内存是要超过maxmemory的。所以我们在服务器设置Redis内存上限时需要预留一些出来给机器的其他进程、内存碎片、fork子进程等。

淘汰策略

通过maxmemory-policy参数来设置内存淘汰策略,当Redis所使用的内存达到maxmemory所设定的值时就会触发该策略。

127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
127.0.0.1:6379> config set maxmemory-policy volatile-lru
OK
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "volatile-lru"

淘汰策略如下:

  • noeviction:当内存达到限制时,不淘汰任何数据,也不可写入任何数据,所有申请内存的命令都会报错。

  • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。

  • alleys-lru:从所有数据集中挑选最近最少使用的数据淘汰。

  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。

  • allkeys-random:从所有数据集中任意选择数据淘汰。

  • volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰(按照TTL从小到大的顺序进行淘汰)。

  • volatile-lfu:对设置了过期时间的数据集采用LFU算法淘汰数据。

  • alleys-lfu:对所有数据集采用LFU算法淘汰数据。

从Redis4.0开始为maxmemory_policy添加了LFU算法。

LRU与LFU区别?

LRU(Least Recently Used)也称最近最少使用算法,LFU(Least Frequently Used)也称最少频繁使用算法。淘汰算法的目的是保留那些将来最有可能被再次访问的数据,淘汰那些将来最没有可能被再次访问的数据。LRU算法的核心是淘汰最近最少访问的数据,而LFU算法的核心是淘汰最少频繁访问的数据。