当前位置:首页 > 内存 > 正文

redis内存淘汰策略

  • 内存
  • 2024-07-02 09:11:42
  • 6257

一、Redis内存配置和淘汰策略

1.在redis安装目录下找到,打开它,找到下面一行:

其中maxmemory是最大内存配置项。如果默认注释掉,则将使用默认的最大值。内存大小:64位操作系统下内存大小没有限制,32位操作系统下最大可以使用3GB。

2.在客户端通过命令行查看

这里的结果是0,说明没有手动指定最大内存,使用默认的最大内存。

一般建议Redis将内存设置为最大物理内存的四分之三。

1.在配置文件中指定maxmemory参数。例如最大内存为200M,则在配置文件中添加maxmemory209751200;
2.通过命令configsetmaxmemory209751200设置。注意,这里如果通过命令行设置最大内存大小,配置文件中不会添加maxmemory209751200这一行。

当Redis达到最大可用内存时,向其中存储数据就会报OOM。因此,为了避免无限数据存储导致的OOM,需要采用合适的内存消除策略。

在讨论Redis的内存淘汰策略之前,我们首先要对Redis中过期key的删除机制有一个大概的了解;事实上,过期密钥的删除策略有3种。每种策略下,过期键的删除时机不同。
1.定时删除
所谓定时删除,就是在设置key的过期时间的同时,创建一个定时器,这样当key的过期时间到来时,定时器可以立即删除该key的删除。它可以立即删除过期的key,这对内存友好,但对CPU不友好,因为需要维护定时器。
2.懒惰删除
所谓懒惰删除,就是不去管过期的key,而是每次获取到key后,检查获取到的key是否已经过期。如果已过期,请删除该密钥。如果未过期,则返回密钥。惰性删除对CPU友好,但由于它不能主动删除过期的key,当过期的key大量积累时,会占用大量内存,不利于内存。
3.定期删除
所谓定期删除是前两种删除策略的折衷。删除过期key的操作会定期执行,通过限制操作执行的持续时间和频率来减少删除操作对CPU时间的影响。
定期删除会定期轮询redis数据库中的及时数据,采用随机抽取策略,利用过期数据的比例来控制删除频率。其特点是:
a)CPU使用率设置有峰值,检测频率可自定义。
b)内存压力有限,长期占用内存的冷数据会被不断清理。
综上所述,定期删除会定期检查存储空间(随机检查、重点抽查)。
周期性删除的难点在于如何确定输出操作的执行时长和频率。如果删除操作执行过于频繁,或者执行时间过长,周期性删除策略就会退化为定时删除策略,这样就会在删除键上消耗过多的CPU时间。如果删除操作执行的次数太少,或者执行时间太短,那么常规删除策略就会和惰性删除策略一样,造成内存的浪费。因此,必须适当设置周期性删除策略的执行时长和执行频率。
定期删除在一定程度上是一种合理有效的过期键删除策略,但是由于其执行时间和执行频率的限制,必须有另外的机制(策略)来保证内存能够被回收,因此,有必要引入内存消除策略。

在中指出了以下8种内存淘汰策略:
le-lru:从过期时间设置为的key中选择最近最少使用的数据消除;
s-lru:从所有key中选择最近最少使用的数据进行消除;
le-lfu:从设置了过期时间的key中选择最不常用的数据进行消除;
s-lfu:从所有key中选择最不常用的数据进行淘汰;
le-random:从设置了过期时间的key中选择任意数据进行淘汰;
s-random:从所有key中随机选择数据进行淘汰
le-ttl:从设置了过期时间的key中选择即将过期的数据进行淘汰;
-enviction:禁止驱逐数据,这也是默认策略。当内存不足以容纳新数据时,新的写操作将会报错。

设置和查看内存消除策略