likes
comments
collection
share

详解Redis内存淘汰策略,哪些策略适用于高并发?

作者站长头像
站长
· 阅读数 17

一、什么是内存淘汰策略,有什么作用和意义呢?

Redis 提供了多种内存淘汰策略,让你可以在 Redis 内存数据集超出物理内存限制时,选择一个合适的淘汰策略。

Redis 内存淘汰策略指的是在 Redis 内存使用达到设定的最大限制时,根据一定的策略选择要删除的键,以便为新的键值对腾出空间。

具体选择哪一种淘汰策略,取决于你的具体应用场景。

内存淘汰策略的作用和意义如下

内存淘汰策略的作用和意义
防止内存溢出
提高内存利用率
控制数据存储成本
优化性能
  • 防止内存溢出:Redis 是一个内存数据库,所有的数据都存储在内存中。当内存使用达到最大限制时,如果没有合适的淘汰策略,新的键值对无法写入,可能导致应用程序出现错误或停止工作。内存淘汰策略的主要作用是防止内存溢出,确保 Redis 在内存有限的情况下仍然能够正常工作。

  • 提高内存利用率:通过删除不再使用或不频繁访问的键,内存淘汰策略可以释放出空间,以便存储新的键值对。这样可以提高内存的利用率,使得 Redis 能够存储更多的数据。

  • 控制数据存储成本:内存是相对昂贵的资源,通过选择合适的淘汰策略,可以控制数据存储的成本。通过删除不再需要的键,可以释放出内存供其他更重要的数据使用,从而降低存储成本。

  • 优化性能:某些淘汰策略可以根据键的访问模式或过期时间来选择淘汰的键。通过淘汰不经常访问或已过期的键,可以提高查询性能,减少内存碎片,提高 Redis 的整体性能。

二、内存淘汰策略怎么触发?

Redis允许通过maxmemory配置项设置最大可用内存。当内存使用达到此限制时,内存淘汰策略会触发。

要设置Redis的maxmemory限制,可以通过以下两种方式之一:

1、 通过配置文件设置

  • 找到Redis的配置文件(通常是redis.conf)。

  • 在配置文件中找到maxmemory的配置项。

  • 将maxmemory设置为所需的内存限制,单位可以是字节(例如:maxmemory 1gb)或者以更友好的方式表示(例如:maxmemory 2GB)。

  • 保存配置文件并重新启动Redis实例,以使更改生效。

2、 通过Redis命令设置

  • 连接到Redis服务器。

  • 使用以下命令之一来设置maxmemory限制:

    • 单位为字节的方式:CONFIG SET maxmemory <value>

    • 以更友好的方式表示:CONFIG SET maxmemory <value>GB(例如:CONFIG SET maxmemory 2GB)

  • 例如,要将maxmemory设置为2GB,可以执行以下命令:CONFIG SET maxmemory 2GB

3、 注意

为了避免将Redis服务器推到内存耗尽的边缘,建议在设置maxmemory限制时留出一些缓冲空间,以便Redis有空间处理一些内部操作和突发的内存需求。

三、redis的哪些内存淘汰策略都是怎么执行的?

3.1 noeviction

默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。

以下是流程图:

设置maxmemory限制
内存使用达到限制
写操作请求
内存不足
写操作拒绝
客户端处理错误

3.2 volatile-lru

当内存不足以容纳新写入数据时,从设置了过期时间 key 中使用 LRU(最近最少使用)算法进行淘汰;

以下是流程图:

内存达到限制
检查过期数据
选择淘汰候选数据-设置了过期时间key
计算数据权重-最近最少使用
选择淘汰数据
淘汰数据
执行写操作

3.3 allkeys-lru

当内存不足以容纳新写入数据时,从所有 key 中使用 LRU(最近最少使用)算法进行淘汰;

以下是流程图:

内存达到限制
选择淘汰候选数据-所有key
计算数据权重-最近最少使用
选择淘汰数据
淘汰数据
执行写操作

3.4 volatile-random

当内存不足以容纳新写入数据时,从设置了过期时间 key 中,随机淘汰数据;

以下是流程图:

内存达到限制
检查过期数据
选择淘汰候选数据-设置了过期时间key
选择淘汰数据-随机选择
淘汰数据
执行写操作

3.5 allkeys-random

当内存不足以容纳新写入数据时,从所有 key 中随机淘汰数据;

以下是流程图:

内存达到限制
选择淘汰候选数据-所有key选择一部分
选择淘汰数据-随机选择
淘汰数据
执行写操作

3.6 volatile-ttl

当内存不足以容纳新写入数据时,在设置了过期时间 key 中,根据过期时间进行淘汰,越早过期优先被淘汰;

以下是流程图:

内存达到限制
检查过期数据-设置了过期时间 key
选择淘汰候选数据-选择一部分
选择淘汰数据-过期时间越早越先
淘汰数据
执行写操作

3.7 volatile-lfu

4.0 版本新增,当内存不足以容纳新写入数据时,在过期 key 中,使用 LFU 算法进行删除 key;

以下是流程图:

内存达到限制
检查过期数据-设置了过期时间 key
选择淘汰候选数据-选择一部分
选择淘汰数据-访问频率越低越先
淘汰数据
执行写操作

3.8 allkeys-lfu

4.0 版本新增,当内存不足以容纳新写入数据时,从所有 key 中使用 LFU 算法进行淘汰;

以下是流程图:

内存达到限制
检查过期数据-所有 key
选择淘汰候选数据-选择一部分
选择淘汰数据-访问频率越低越先
淘汰数据
执行写操作

四、Redis的内存淘汰策略对性能影响吗?

Redis的内存淘汰策略对性能有一定的影响,具体影响取决于选择的淘汰策略以及应用的使用模式和负载情况。

在选择Redis的内存淘汰策略时,需要综合考虑应用的数据访问模式、内存使用情况以及性能需求。合理选择淘汰策略,并根据实际情况进行调优,可以最大程度地平衡内存使用和性能之间的关系。

内存淘汰策略对性能的影响主要包括以下几个方面

内存淘汰策略对性能影响
数据访问延迟
数据命中率
内存使用效率
淘汰过程的开销
  1. 数据访问延迟:当Redis执行内存淘汰时,如果需要淘汰的数据被频繁访问,可能会导致数据从内存中被移除,而后续访问需要从磁盘或其他存储介质中加载数据,增加了访问延迟。这可能会对应用的响应时间产生一定的影响。

  2. 数据命中率:选择适当的内存淘汰策略可以影响数据的命中率。例如,使用volatile-ttl策略可以更好地保留尚未过期的数据,从而提高数据的命中率。而选择不合适的淘汰策略可能导致更多的缓存未命中,需要从其他数据源获取数据,降低了性能。

  3. 内存使用效率:不同的内存淘汰策略对于内存使用的效率也有影响。一些策略可能更倾向于保留访问频率高的数据,从而提高内存利用率。而另一些策略可能更注重保留过期时间较长的数据。选择适合应用需求的策略可以更有效地利用内存资源。

  4. 淘汰过程的开销:执行内存淘汰操作本身会带来一定的开销,包括检查、排序和移除数据等操作。如果淘汰操作频繁发生,可能会占用一定的CPU和IO资源,对系统性能产生一定的影响。

五、Redis的哪种内存淘汰策略适合高并发的应用?

对于高并发的应用,适合选择以下两种内存淘汰策略:

适合高并发策略
volatile-lru
volatile-ttl

5.1 volatile-lru(基于最近最少使用的优先级)

volatile-lru会优先淘汰最近最少使用的数据,即最近很长时间内没有被访问的数据。这++适用于高并发应用中的热点数据++,因为热点数据通常会被频繁访问,而冷数据很少被访问。通过淘汰最近最少使用的数据,可以更有效地释放内存并保留热点数据,提高缓存命中率和响应性能。

5.2 volatile-ttl(基于过期时间的优先级)

volatile-ttl会优先淘汰即将过期的数据,即过期时间最近的数据。对于高并发应用,可能会++有一些临时性的数据存储在Redis中,并且很快就会过期++。通过选择volatile-ttl策略,可以优先淘汰这些即将过期的数据,腾出空间来存储新的数据。这样可以确保缓存中存储的数据总是相对较新的,适用于需要及时更新的高并发应用场景。

转载自:https://juejin.cn/post/7280430881965211702
评论
请登录