当前位置: 首页 > news >正文

从零起步学习Redis || 第八章:过期删除策略与内存淘汰策略详解及实战使用(LRU和LFU算法详解)

一、前言

在日常开发中,Redis 凭借其高性能和丰富的数据结构,成为后端缓存系统的首选。然而,随着数据量不断增加,内存占用与数据过期管理 成为必须关注的问题。

本文将系统讲解 Redis 的两大核心机制:

  • 过期删除策略(Expiration Deletion Policy)

  • 内存淘汰策略(Eviction Policy)


二、Redis 过期删除策略

1. 如何设置过期时间

Redis 提供多种方式为 Key 设置过期时间(TTL,Time To Live):

命令说明示例
expire key seconds设置生存时间(秒)expire user:1 60
pexpire key milliseconds设置生存时间(毫秒)pexpire user:1 1500
expireat key timestamp设置过期时间(秒级时间戳)expireat user:1 1736179200
pexpireat key milliseconds-timestamp设置过期时间(毫秒级时间戳)pexpireat user:1 1736179200123
set key value ex seconds设置值并指定过期时间set session 123 ex 60

 查看 TTL:

ttl key

返回:

  • -1 → 永不过期

  • -2 → 已过期或不存在


2. Redis 如何判断 Key 是否过期

Redis 内部为每个带有过期时间的 key 维护一个 过期字典(expires),保存该 key 的过期时间戳。

判断逻辑:

当访问一个 key 时,如果当前系统时间 > 过期时间戳,则该 key 被标记为过期。


3.过期字典是如何实现的?

Redis 在服务器内部维护着两个主要的全局字典:

字典名作用
db->dict保存所有的 键值对(key → value)
db->expires保存所有 带过期时间的键(key → 过期时间戳)

也就是说,一个 key 如果设置了过期时间,会在两个地方出现:

  • db->dict → 保存 key 对应的值;

  • db->expires → 保存 key 的过期时间。

📌 key 只有在设置了 TTL 时才会出现在 expires 字典中。

Redis 的 expires 是一个 哈希表(dict),与普通的 db->dict 类似。

其结构类似于:

dict *expires;  // 保存过期时间的字典

内部数据(伪结构):

expires = {"user:1" -> 1736200000000,   // 毫秒级时间戳"session:abc" -> 1736200050000,"token:xyz" -> 1736200100000
}

Redis 以 毫秒时间戳 记录过期时间(使用 mstime() 获取当前时间)。

4. Redis 三种过期删除策略

策略说明优点缺点
惰性删除(Lazy Deletion)访问 key 时检查是否过期,若过期则删除。减少 CPU 消耗可能堆积过期 key,占内存
定期删除(Periodic Deletion)Redis 每秒10次 抽样检测20个 key(源码中写死了) 是否过期并删除。控制内存增长占用部分 CPU
混合策略(实际采用)Redis 同时使用惰性删除 + 定期删除。性能与内存平衡最佳

还有一个定时删除策略:在设置key的过期时间时还会设置一个定时事件,当时间达到后,事件来控制key的删除。

注意,在定期删除中,如果本轮检查的 已过期 key 的数量 超过5个(20*0.25),也就是「已过期 key 的数量」占比「随机抽取 key 的数量」大于 25%,则继续抽样,即重复执行删除策略;如果已过期的 key 比例小于 25%,则停止继续删除过期 key,然后等待下一轮再检查。

那 Redis 为了保证定期删除不会出现循环过度,导致线程卡死现象,为此增加了定期删除循环流程的时间上限,默认不会超过 25ms

🧠 总结一句话:

Redis 通过 “惰性 + 定期” 的混合删除策略,在性能与内存之间取得平衡。


三、Redis 内存淘汰策略

当 Redis 的内存使用达到上限(maxmemory)时,会触发内存淘汰机制。


1. 设置 Redis 最大内存

配置文件 redis.conf

maxmemory 512mb

或命令行动态设置:

config set maxmemory 512mb

查看配置:

config get maxmemory


2. Redis 内存淘汰策略列表

通过以下配置设置:

maxmemory-policy <policy>

策略说明适用场景
noeviction不淘汰,写操作报错默认值,不建议用于缓存系统
volatile-lru在带过期时间的键中,淘汰最近最少使用的临时数据场景
volatile-lfu在带过期时间的键中,淘汰使用次数最少的Redis 4.0+,热点数据
volatile-ttl在带过期时间的键中,优先淘汰即将过期的对 TTL 敏感的业务
volatile-random在带过期时间的键中随机淘汰特殊需求
allkeys-lru在所有键中淘汰最近最少使用的常见缓存策略
allkeys-lfu在所有键中淘汰使用频率最低的高频访问系统
allkeys-random在所有键中随机删除简单但不推荐

 推荐策略:

  • 缓存系统allkeys-lruallkeys-lfu

  • 仅缓存临时数据volatile-lru


四、LRU 与 LFU 算法解析

1. LRU(Least Recently Used)

  • 定义:淘汰最近最少使用的 Key。

  • 核心思想:如果一个 Key 很久没被访问,说明它可能不再重要。

  • Redis 实现:使用近似 LRU 算法,通过访问时间采样实现。在Redis的对象结构体中添加了一个字段:记录此数据最后一次的访问时间(lru)


2. LFU(Least Frequently Used)

  • 定义:淘汰一段时间内访问次数最少的 Key。

  • 核心思想:被频繁访问的数据应更“珍贵”。

  • Redis 4.0+ 支持 LFU,通过访问计数器和衰减算法实现。在Redis的对象结构体中添加了两个字段:记录此数据最后一次的访问时间和访问频次

配置项:

lfu-log-factor 10
lfu-decay-time 1

下图内容来源于:小林codingRedis 过期删除策略和内存淘汰策略有什么区别? | 小林coding | Java面试学习


3. LRU vs LFU 对比表

特性LRULFU
依据最近访问时间访问频率
优点简单高效更智能,识别真正热点
缺点忽略访问频率实现复杂度更高
适合场景时间局部性强(短期热点)稳定长期热点
Redis 支持版本所有版本4.0+

五、总结

内容核心要点
过期删除策略惰性删除 + 定期删除(混合策略)
内存淘汰条件内存达到 maxmemory 限制
内存淘汰策略LRU、LFU、TTL、RANDOM 等
推荐策略缓存场景使用 allkeys-lfuallkeys-lru
算法区别LRU:最近最少使用;LFU:最少使用频率

六、Java 后端开发实战建议

在 Spring Boot 项目中使用 Redis 时,可通过配置实现:

spring:data:redis:host: localhostport: 6379timeout: 3000cache:redis:time-to-live: 60s

建议:

  1. 缓存数据时务必设置 合理的 TTL

  2. 根据业务选择合适的淘汰策略;

  3. 对于热点数据,建议使用 LFU 策略提升命中率;

  4. 结合 缓存预热 + 更新机制,防止缓存击穿。


七、结语

Redis 的过期删除与内存淘汰机制,是保障缓存系统 稳定性与高性能 的关键。

http://www.dtcms.com/a/449354.html

相关文章:

  • 自动驾驶中的传感器技术65——Navigation(2)
  • 知识体系_scala_利用scala和spark构建数据应用
  • 备案后网站打不开沈阳营销网站建设
  • AI编辑器(FIM补全,AI扩写)简介
  • 优设网设计师导航最新seo快排技术qq
  • 【C++】哈希和哈希封装unordered_map、unordered_set
  • VS Code安装即环境配置
  • 从 LiveData 到 Flow:状态、事件、背压与回调全面实战
  • 数据库与缓存数据一致性的全部方案
  • 算命公司网站建设制作开发方案网站商城怎么做app
  • 遗传算法解决TSP问题
  • MVC的含义
  • DBSCAN 密度聚类算法
  • 【极客日常】用Eino+Ollama低成本研发LLM的Agent
  • 《深入 Django ORM:select_related 与 prefetch_related 的实战剖析与性能优化指南》
  • 男科医院网站模板视频加字幕软件app
  • 网站开发自荐信江门专业网站制作费用
  • nat address-group 概念及题目
  • 深度学习模型构建的本质——“核心四要素+任务适配逻辑”
  • 基于SpringBoot+Vue的志行交通法规在线模拟考试(AI问答、WebSocket即时通讯、Echarts图形化分析、随机测评)
  • 厦门建网站费用一览表网站设计流行趋势
  • Docker Compose 搭建 LNMP 环境并部署 WordPress 论坛
  • 无锡企业网站制作哪家好前端的网站重构怎么做
  • TensorFlow2 Python深度学习 - 深度学习概述
  • Davor的北极探险资金筹集:数学建模与算法优化(洛谷P4956)
  • Web Components 的开发过程举例
  • 【Algorithm】Day-1
  • 提示工程深度解析:驾驭大语言模型的艺术与科学
  • 网站开发证书是什么中国建设学会查询网站
  • java代码随想录day50|图论理论基础