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

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

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

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

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

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

graph TD A(内存淘汰策略的作用和意义) ---> B(防止内存溢出) A(内存淘汰策略的作用和意义) ---> C(提高内存利用率) A(内存淘汰策略的作用和意义) ---> D(控制数据存储成本) A(内存淘汰策略的作用和意义) ---> E(优化性能) style B fill:#FFC0CB,stroke:#FFC0CB,stroke-width:2px style C fill:#FFA07A,stroke:#FFA07A,stroke-width:2px style D fill:#FFFFE0,stroke:#FFFFE0,stroke-width:2px style E fill:#98FB98,stroke:#98FB98,stroke-width:2px
  • 防止内存溢出: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

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

以下是流程图:

graph TD A[设置maxmemory限制] --> B[内存使用达到限制] B --> C[写操作请求] C --> D[内存不足] D --> E[写操作拒绝] E --> F[客户端处理错误]

3.2 volatile-lru

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

以下是流程图:

graph TD A[内存达到限制] --> B[检查过期数据] B --> C[选择淘汰候选数据-设置了过期时间key] C --> D[计算数据权重-最近最少使用] D --> E[选择淘汰数据] E --> F[淘汰数据] F --> G[执行写操作]

3.3 allkeys-lru

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

以下是流程图:

graph TD A[内存达到限制] --> B[选择淘汰候选数据-所有key] B --> C[计算数据权重-最近最少使用] C --> D[选择淘汰数据] D --> E[淘汰数据] E --> F[执行写操作]

3.4 volatile-random

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

以下是流程图:

graph TD A[内存达到限制] --> B[检查过期数据] B --> C[选择淘汰候选数据-设置了过期时间key] C --> D[选择淘汰数据-随机选择] D --> E[淘汰数据] E --> F[执行写操作]

3.5 allkeys-random

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

以下是流程图:

graph TD A[内存达到限制] --> B[选择淘汰候选数据-所有key选择一部分] B --> C[选择淘汰数据-随机选择] C --> D[淘汰数据] D --> E[执行写操作]

3.6 volatile-ttl

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

以下是流程图:

graph TD A[内存达到限制] --> B[检查过期数据-设置了过期时间 key] B --> C[选择淘汰候选数据-选择一部分] C --> D[选择淘汰数据-过期时间越早越先] D --> E[淘汰数据] E --> F[执行写操作]

3.7 volatile-lfu

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

以下是流程图:

graph TD A[内存达到限制] --> B[检查过期数据-设置了过期时间 key] B --> C[选择淘汰候选数据-选择一部分] C --> D[选择淘汰数据-访问频率越低越先] D --> E[淘汰数据] E --> F[执行写操作]

3.8 allkeys-lfu

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

以下是流程图:

graph TD A[内存达到限制] --> B[检查过期数据-所有 key] B --> C[选择淘汰候选数据-选择一部分] C --> D[选择淘汰数据-访问频率越低越先] D --> E[淘汰数据] E --> F[执行写操作]

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

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

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

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

graph LR A(内存淘汰策略对性能影响) ---> B(数据访问延迟) A(内存淘汰策略对性能影响) ---> C(数据命中率) A(内存淘汰策略对性能影响) ---> D(内存使用效率) A(内存淘汰策略对性能影响) ---> E(淘汰过程的开销) style B fill:#FFC0CB,stroke:#FFC0CB,stroke-width:2px style C fill:#FFA07A,stroke:#FFA07A,stroke-width:2px style D fill:#FFFFE0,stroke:#FFFFE0,stroke-width:2px style E fill:#98FB98,stroke:#98FB98,stroke-width:2px
  1. 数据访问延迟:当Redis执行内存淘汰时,如果需要淘汰的数据被频繁访问,可能会导致数据从内存中被移除,而后续访问需要从磁盘或其他存储介质中加载数据,增加了访问延迟。这可能会对应用的响应时间产生一定的影响。

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

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

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

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

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

graph LR A(适合高并发策略) ---> D(volatile-lru) A(适合高并发策略) ---> E(volatile-ttl) style D fill:#FFFFE0,stroke:#FFFFE0,stroke-width:2px style E fill:#98FB98,stroke:#98FB98,stroke-width:2px

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

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

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

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

相关推荐
Tech Synapse15 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
.生产的驴15 分钟前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
微信-since8119231 分钟前
[ruby on rails] 安装docker
后端·docker·ruby on rails
肥猪猪爸33 分钟前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
readmancynn1 小时前
二分基本实现
数据结构·算法
萝卜兽编程1 小时前
优先级队列
c++·算法
盼海1 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步1 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
登云时刻1 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
redis·kubernetes·bootstrap
Rstln2 小时前
【DP】个人练习-Leetcode-2019. The Score of Students Solving Math Expression
算法·leetcode·职场和发展