Redis——数据淘汰策略

文章目录

  • [1. 引入](#1. 引入)
  • [2. 讲解](#2. 讲解)
    • [2.1 Redis 中的 8 种数据淘汰策略](#2.1 Redis 中的 8 种数据淘汰策略)
    • [2.2 LRU 和 LFU 算法](#2.2 LRU 和 LFU 算法)
    • [2.3 建议](#2.3 建议)
  • [3. 总结](#3. 总结)

1. 引入

Redis------数据过期策略 的"引入"部分讲解过,Redis 的数据存在内存中,而内存容量相对较小,不能将大量数据 无限期 地缓存。然而,对于有些场景,例如 缓存击穿 的解决方案二------逻辑过期,需要将一部分数据 "无限期" 地缓存到 Redis 中;或者在某一时间段内,海量查询请求使得大量数据缓存到 Redis 中。

那么当缓存的数据越来越多,直至 Redis 的最大内存限制时,Redis 会如何应对呢?这就涉及到本文要讲的 数据淘汰策略 (缓存淘汰策略 ),即 Redis 在内存达到最大限制时,为了释放空间,选择键删除的方式

2. 讲解

2.1 Redis 中的 8 种数据淘汰策略

Redis 的数据淘汰策略共有 8 种:

  • noeviction:不淘汰任何键,内存达到最大限制后不允许写入新数据,是 默认策略
  • volatile-ttl:对设置了 TTL (Time-to-Live,过期时间) 的键,比较键的剩余 TTL 值,TTL 越小的值,越先淘汰。
  • allkeys-random:对于所有键,随机选择并淘汰。
  • volatile-random:对于设置了 TTL 的键,随机选择并淘汰。
  • allkeys-lru:对于所有键,基于 LRU 算法进行淘汰。
  • volatile-lru:对于设置了 TTL 的键,基于 LRU 算法进行淘汰。
  • allkeys-lfu:对于所有键,基于 LFU 算法进行淘汰。
  • volatile-lfu:对于设置了 TTL 的键,基于 LFU 算法进行淘汰。

在 Redis 的 redis.conf 配置文件中,配置方式如下:

conf 复制代码
maxmemory-policy allkeys-lru # 使用 对所有键按 LRU 淘汰 的策略

2.2 LRU 和 LFU 算法

  • LRU (Least Recently Used,最近最少使用):重点关注数据的 使用时间 ,淘汰 最久未使用 的数据。假如三个键 name, age, weight 从前到后依次缓存到 Redis 中,并且使用的顺序为 age -> name -> weight -> name,如果需要基于 LRU 淘汰,则淘汰的优先级是 age > weight > name
  • LFU (Least Frequently Used,最少频率使用):重点关注数据的 使用频率 ,淘汰 使用频率最低 的数据。

2.3 建议

  • 一般情况下,使用 allkeys-lru 策略,把 最近最常用 的数据留在缓存中。因为大部分情况下,数据都是有 冷热 之分的,也就说有些数据 访问频率 高,有些低;然而 很久之前的 访问频率高的 数据再被访问的可能性不大,所以不需要缓存很久之前的数据。综上所述,一般情况适合使用 allkeys-lru 策略。

3. 总结

当 Redis 的内存达到最大限制时,Redis 会根据指定数据淘汰策略,选择一些数据进行淘汰。其中,需要重点理解 LRU (淘汰最久未使用的数据) 和 LFU (淘汰使用频率最低的数据) 这两种算法。在生产中,建议使用 allkeys-lru 这种数据淘汰策略,保存 最近最常用 的数据。

相关推荐
NE_STOP2 分钟前
SpringBoot--简单入门
java·spring
hqxstudying29 分钟前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
Dcs1 小时前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing1 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者1 小时前
Java的SPI机制详解
java
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug2 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享2 小时前
Java Lombok 入门
java
程序无bug2 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队2 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端