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

Redis缓存淘汰策略:LRU算法(最近最少使用)原理与Java实现

一、LRU算法概述

redis缓存淘汰策略-LRU算法(最近最少使用)

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据予以淘汰。

二、缓存的基本要求

1. 所谓缓存,必须要有读+写两个操作,按照命中率的思路考虑,写操作+读操作时间复杂度都需要为O(1)。

三、LRU算法的特性要求

2.1必须要有顺序之分,以区分最近使用的和很久没有使用的数据排序。

2.2写和读操作一次搞定。

2.3如果容量(坑位)满了要删除最不常用的数据,每次新访问还要把新的数据插入到队头(按照业务你自己设定左右哪一边是队头)。

查找快、插入快、删除快,且还需要先后排序...

问题:什么样的数据结构可以满足这个问题?你是否可以在O(1)时间复杂度内完成这两种操作?如果一次就可以找到,你觉得什么数据结构最合适?

四、基于LinkedHashMap实现LRU算法

LinkedHashMap是Java中实现LRU算法的理想选择,因为它内部维护了一个双向链表来记录插入顺序或访问顺序。

4.1 核心代码实现

package lru; import java.util.LinkedHashMap; import java.util.Map; public class LRUCacheDemo<K, V> extends LinkedHashMap<K, V> { private int capacity; /** * accessorder the ordering mode * &lt;tt&gt;true&lt;/tt&gt; for access-order, * &lt;tt&gt;false&lt;/tt&gt; for insertion-order * @param capacity 缓存容量 */ public LRUCacheDemo(int capacity) { super(capacity, 0.75F, true); this.capacity = capacity; } @Override protected boolean removeEldestEntry(Map.Entry&lt;K, V&gt; eldest) { return super.size() &gt; capacity; // return super.removeEldestEntry(eldest); } public static void main(String[] args) { LRUCacheDemo&lt;Integer, String&gt; lruCacheDemo = new LRUCacheDemo&lt;&gt;(3); lruCacheDemo.put(1, "a"); lruCacheDemo.put(2, "b"); lruCacheDemo.put(3, "c"); System.out.println(lruCacheDemo.keySet()); // lruCacheDemo.put(4, "d"); } }

4.2 代码执行效果演示

当添加第四个数据进来,这时候就会将1挤出去,淘汰1:

五、关键参数说明

不知道前面有一行代码注意没有?

关键点:super(capacity, 0.75F, false); // true改成了false

这里的第三个参数accessOrder非常重要:

  • true:按访问顺序排序(LRU模式)
  • false:按插入顺序排序

六、总结

LRU算法通过维护数据的访问顺序来实现缓存淘汰,LinkedHashMap的accessOrder参数设置为true时,可以自动实现LRU特性。当缓存满时,最久未访问的数据会被自动淘汰,保证了缓存中始终是最活跃的数据。

优点:

  • 实现简单,利用LinkedHashMap即可
  • 时间复杂度为O(1)
  • 符合"最近最少使用"的直觉

适用场景:

  • Redis缓存淘汰策略
  • 浏览器缓存管理
  • 数据库查询缓存
  • 任何需要缓存淘汰机制的场景
http://www.jsqmd.com/news/1349191/

相关文章:

  • 技术分歧如何有效沟通:用代码和数据驱动的结构化论证方法
  • 兰州老酒回收店铺哪家靠谱?本地资深门店推荐汇创茗酒荟 - 品牌优推
  • Windows-Auto-Night-Mode年度回顾:2024年功能更新与用户增长
  • 第十二届花样少年语言艺术展演全国总展演在成都圆满举行
  • 数据分析与商业分析融合:构建数据驱动决策的完整技能框架
  • UniPush 2.0集成实战:从零构建uni-app多端消息推送系统
  • 从ROS到ROS2:AutowareArchitectureProposal移植指南与兼容性处理
  • Boltz-2:突破性生物分子结构预测与亲和力计算模型
  • 51单片机超声波测距系统Proteus仿真全攻略:从原理到代码实现
  • 基于STM32的智能MPU6050陀螺仪遥控蓝牙小车电子物联网智能车
  • 成都别墅装修公司哪家好?2026本地业主参考的靠谱装企 - 推荐官
  • 2026实力之选:五金冲压件加工领域值得关注的专业公司 - 卓企推荐
  • 终极消息防撤回解决方案:RevokeMsgPatcher完整指南
  • Windows-Auto-Night-Mode代码文档:如何编写清晰的类与方法注释
  • vm 安装ubuntu server 18.04 周边配置
  • FGO-py:解放双手的Fate/Grand Order全自动刷本神器
  • Windows-Auto-Night-Mode安全审计:保护用户设置与系统资源
  • 三元组存储引擎设计揭秘
  • 如何实现微信QQ防撤回:终极逆向工程指南
  • 3分钟解锁免费OpenAI API密钥:零门槛开启AI开发实战指南
  • 2026年三季度南充广告设计制作安装|华蔓广告|水晶字,穿孔字,烤漆字等标识制作综合服务公司 - 四川华蔓广告有限公司
  • 2026年三季度南充广告设计制作安装|华蔓广告|雪弗板,PVC板雕刻,KT板等标识制作综合服务公司 - 四川华蔓广告有限公司
  • 成都旧房翻新避坑指南!2026靠谱旧改装企多家整理推荐 - 推荐官
  • 30天小白学透大模型:从入门到实战,附收藏版自学路径
  • 2026小程序系统多维度技术与落地能力深度解析
  • 2026 年讷河靠谱的铜锅涮肉切片机源头厂家联系电话,店里天天排队的铜锅涮肉,原来用这玩意儿省了一半人力成本? - 行业推荐官[官方】--
  • 从理论到实践:TencentDB Agent Memory符号化记忆技术原理与应用
  • QEMU进阶:从虚拟机到动态模块测试沙盒的实战指南
  • 2026年C型铝箔复合内膜袋生产厂家与品牌机构实力解析 - 卓企推荐
  • Windows-Auto-Night-Mode错误处理机制:确保系统稳定性的策略