Redis内存淘汰策略

在 Redis 中 过期策略 和 内存淘汰策略 是两个完全不同的概念。Redis 过期策略指的是 Redis 使用那种策略,来删除已经过期的键值对;而内存淘汰机制指的是当 Redis 运行内存已经超过设置的最大内存之后,将采用什么策略来删除符合条件的键值对,以此来保障 Redis 高效的运行。

查询最大运行内存

1
2
3
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"

0表示不限制内存使用。

内存淘汰策略

1
2
3
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"

使用的是 noeviction 类型的内存淘汰机制

内存淘汰策略分类:

  • noeviction:不淘汰任何数据,当内存不足时,新增操作会报错,Redis 默认内存淘汰策略;

  • allkeys-lru:淘汰整个键值中最久未使用的键值;

  • allkeys-random:随机淘汰任意键值;

  • volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值;

  • volatile-random:随机淘汰设置了过期时间的任意键值;

  • volatile-ttl:优先淘汰更早过期的键值。

  • volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值;

  • allkeys-lfu:淘汰整个键值中最少使用的键值。

修改内存淘汰策略

  1. 在启动的配置文件中设置,“maxmemory-policy 策略”,设置后启动生效。

  2. 在运行中设置,通过 config set maxmemory-policy <策略> 命令设置

内存淘汰算法

主要有两种淘汰算法:LRU 算法和 LFU 算法。

LRU 算法

LRU 全称是 Least Recently Used 译为最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。

LRU 算法基于链表结构实现,链表中的元素按照操作顺序从前往后排列,最新操作的键会被移动到表头,当需要内存淘汰时,只需要删除链表尾部的元素即可。

LFU 算法

LFU 全称是 Least Frequently Used 翻译为最不常用的,最不常用的算法是根据总访问次数来淘汰数据的,它的核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。

LRU 算法有一个缺点,比如说很久没有使用的一个键值,如果最近被访问了一次,那么它就不会被淘汰,即使它是使用次数最少的缓存,那它也不会被淘汰,这种情况就可以用LFU算法来优化。

参考