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月前
|
数据管理 开发者 Python
揭秘Python的__init__.py:从入门到精通的包管理艺术
__init__.py是Python包管理中的核心文件,既是包的身份标识,也是模块化设计的关键。本文从其历史演进、核心功能(如初始化、模块曝光控制和延迟加载)、高级应用场景(如兼容性适配、类型提示和插件架构)到最佳实践与常见陷阱,全面解析了__init__.py的作用与使用技巧。通过合理设计,开发者可构建优雅高效的包结构,助力Python代码质量提升。
1034 10
|
JSON 前端开发 API
多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解
理论上array.flat()能做的事情,array.flatMap()都可以做,但是array.flat()更简单,占用内存更少,执行更快。 这个相对冷门一些,w3school上都没有相关教程,看到就是赚到,收藏就是财富! 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助
|
存储 人工智能 运维
大模型训练稳定性思考和实践
本次分享由阿里云智能集团高级技术专家张彭城主讲,聚焦大模型训练的稳定性问题。主要内容分为三部分:1) 大模型训练稳定性的关键挑战,包括大规模同步任务中的故障率高和恢复成本大;2) 阿里云大模型训练稳定性系统的介绍,涵盖健康检测、实时可观测系统及自愈系统;3) 实践分享,探讨集群网络故障定位与修复、性能优化等实际问题的解决方案。通过这些措施,确保大模型训练的高效与稳定。
|
存储 算法 安全
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
757 1
|
缓存 前端开发 JavaScript
html最大限度提高加载速度
要提高HTML页面的加载速度,可以采用多种策略:优化HTML结构,精简标签和合并文件;使用异步加载资源,如添加`async`或`defer`属性;压缩文件,利用HTMLMinifier减小文件大小;优化图片,采用合适格式和尺寸;利用CDN托管静态资源;设置HTTP缓存头以利用浏览器缓存;减少HTTP请求,合并文件;启用Gzip压缩;优化服务器响应时间;使用优雅降级和渐进增强确保兼容性。综合应用这些方法能显著提升加载速度和用户体验。
|
XML 存储 编解码
PyMuPDF 1.24.4 中文文档(八)(5)
PyMuPDF 1.24.4 中文文档(八)
1206 1
PyMuPDF 1.24.4 中文文档(八)(5)
|
存储 SQL 关系型数据库
binlog、redolog和undolog三者有何区别?
MySQL中的binlog、redo log和undo log是日志文件,各有特定作用。binlog用于数据备份、恢复和复制,适用于所有存储引擎。redo log记录事务修改,用于崩溃恢复和数据持久性,仅InnoDB存储引擎支持。undo log保存事务修改前的状态,用于事务回滚和MVCC,也仅InnoDB支持。它们在功能和记录内容上有明显区别,有助于事务管理和数据库一致性。
1290 0
|
JSON 人工智能 算法
pyjwt,一个强大的 Python JWT解析校验库!
pyjwt,一个强大的 Python JWT解析校验库!
1028 0