LRU是什么?如何实现?

简介: LRU(Least Recently Used)是一种常用的缓存淘汰策略,其核心思想是:如果一个数据在最近一段时间内没有被访问到,那么在未来它被访问的可能性也很小。因此,当缓存满了的时候,最久未使用的数据会被淘汰

LRU的定义
LRU(Least Recently Used)是一种常用的缓存淘汰策略,其核心思想是:如果一个数据在最近一段时间内没有被访问到,那么在未来它被访问的可能性也很小。因此,当缓存满了的时候,最久未使用的数据会被淘汰

LRU的实现方法

  1. 数组+时间戳
    一种简单的实现方法是使用一个数组来存储数据,并给每一个数据项标记一个访问时间戳。每次插入新数据项时,先把数组中存在的数据项的时间戳自增,并将新数据项的时间戳置为0并插入到数组中。每次访问数组中的数据项时,将被访问的数据项的时间戳置为0。当数组空间已满时,将时间戳最大的数据项淘汰

  2. 链表实现
    另一种方法是利用一个链表来实现,每次新插入数据的时候将新数据插到链表的头部;每次缓存命中(即数据被访问),则将数据移到链表头部;那么当链表满的时候,就将链表尾部的数据丢弃

  3. 链表+HashMap
    最常用的实现方式是结合链表和HashMap。当需要插入新的数据项时,如果新数据项在链表中存在(一般称为命中),则把该节点移到链表头部,如果不存在,则新建一个节点,放到链表头部,若缓存满了,则把链表最后一个节点删除即可。在访问数据的时候,如果数据项在链表中存在,则把该节点移到链表头部,否则返回-1。这样一来,在链表尾部的节点就是最近最久未访问的数据项

  4. 使用LinkedHashMap实现
    在Java中,可以使用LinkedHashMap来实现LRU缓存。LinkedHashMap保持了元素插入的顺序或最近访问的顺序。通过重写removeEldestEntry()方法来定义何时移除老的条目,并通过访问和修改操作来更新访问顺序

  5. 矩阵实现
    还有一种较为新颖的矩阵实现方式,通过一个矩阵来记录每个元素的访问状态,当entry满了之后,通过比较矩阵中的值来挑选出最久没有被使用的元素

LRU缓存机制的优化
LRU缓存机制的优化主要集中在提高读写性能和减少内存消耗上。通过上述的实现方法,LRU缓存可以在O(1)的时间内完成数据的读取和更新,这对于需要频繁访问缓存的应用场景来说非常重要

总结
LRU缓存机制是一种高效的缓存淘汰策略,通过淘汰最久未使用的数据来优化缓存的使用。在实际应用中,可以根据具体的业务需求和环境选择合适的实现方法,以达到最优的性能表现。

相关文章
|
11月前
|
测试技术 开发工具 git
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
为了高效地发现、定位和解决预发问题,闲鱼团队研发了一套异常日志问题自动追踪-定位-分发机制。这套机制通过自动化手段,实现了异常日志的定时扫描、精准定位和自动分发,显著降低了开发和测试的成本,提高了问题解决的效率。
480 15
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
|
2月前
|
机器学习/深度学习 缓存 算法
解密Qwen3三连发:强化学习新算法GSPO!
强化学习(RL)是提升语言模型推理与问题求解能力的关键技术。然而,现有算法如 GRPO 在长期训练中存在严重不稳定性,限制了性能提升。为此,我们提出 **Group Sequence Policy Optimization (GSPO)**,通过在序列层面定义重要性比率并进行优化,显著提升了训练效率与稳定性。GSPO 在 MoE 模型训练中表现出色,无需依赖复杂策略即可实现高效训练,简化了 RL 基础设施。该算法已成功应用于 Qwen3 系列模型,推动 RL scaling 边界,释放模型潜能。
295 0
|
5月前
|
数据管理 开发者 Python
揭秘Python的__init__.py:从入门到精通的包管理艺术
__init__.py是Python包管理中的核心文件,既是包的身份标识,也是模块化设计的关键。本文从其历史演进、核心功能(如初始化、模块曝光控制和延迟加载)、高级应用场景(如兼容性适配、类型提示和插件架构)到最佳实践与常见陷阱,全面解析了__init__.py的作用与使用技巧。通过合理设计,开发者可构建优雅高效的包结构,助力Python代码质量提升。
455 10
|
NoSQL 前端开发 rax
Dev 日志 | 一次 Segmentation Fault 和 GCC Illegal Instruction 编译问题排查
本文记录了 Segmentation fault (core dumped) 和 internal compiler error: Illegal instruction 两个错误信息的 Debug 过程
2861 0
Dev 日志 | 一次 Segmentation Fault 和 GCC Illegal Instruction 编译问题排查
|
缓存 算法 调度
数据结构之 - 双端队列数据结构详解: 从基础到实现
数据结构之 - 双端队列数据结构详解: 从基础到实现
604 5
|
缓存 前端开发 JavaScript
html最大限度提高加载速度
要提高HTML页面的加载速度,可以采用多种策略:优化HTML结构,精简标签和合并文件;使用异步加载资源,如添加`async`或`defer`属性;压缩文件,利用HTMLMinifier减小文件大小;优化图片,采用合适格式和尺寸;利用CDN托管静态资源;设置HTTP缓存头以利用浏览器缓存;减少HTTP请求,合并文件;启用Gzip压缩;优化服务器响应时间;使用优雅降级和渐进增强确保兼容性。综合应用这些方法能显著提升加载速度和用户体验。
|
存储 缓存 IDE
CAN通信的基本原理与实现方法
CAN通信的基本原理与实现方法
2171 1
|
机器学习/深度学习 数据采集 人工智能
【机器学习】QLoRA:基于PEFT亲手量化微调Qwen2大模型
【机器学习】QLoRA:基于PEFT亲手量化微调Qwen2大模型
815 0
【机器学习】QLoRA:基于PEFT亲手量化微调Qwen2大模型
|
存储
好看又规范的Github Readme 制作指南
本文是关于制作规范且外观吸引人的GitHub README文件的指南,包括了README的基本结构、美化技巧,以及如何使用Markdown格式、徽标和图片来增强文档的可读性和吸引力。
1167 0
|
存储 SQL 关系型数据库
binlog、redolog和undolog三者有何区别?
MySQL中的binlog、redo log和undo log是日志文件,各有特定作用。binlog用于数据备份、恢复和复制,适用于所有存储引擎。redo log记录事务修改,用于崩溃恢复和数据持久性,仅InnoDB存储引擎支持。undo log保存事务修改前的状态,用于事务回滚和MVCC,也仅InnoDB支持。它们在功能和记录内容上有明显区别,有助于事务管理和数据库一致性。
815 0

热门文章

最新文章