`
gaofen100
  • 浏览: 1227681 次
文章分类
社区版块
存档分类
最新评论

LRU缓存介绍与实现(Java)

 
阅读更多

引子:

我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系了,要再次联系那位朋友的时候,我们又不得不求助电话本,但是,通过电话本查找还是很费时间的。但是,我们大脑能够记住的东西是一定的,我们只能记住自己最熟悉的,而长时间不熟悉的自然就忘记了。

其实,计算机也用到了同样的一个概念,我们用缓存来存放以前读取的数据,而不是直接丢掉,这样,再次读取的时候,可以直接在缓存里面取,而不用再重新查找一遍,这样系统的反应能力会有很大提高。但是,当我们读取的个数特别大的时候,我们不可能把所有已经读取的数据都放在缓存里,毕竟内存大小是一定的,我们一般把最近常读取的放在缓存里(相当于我们把最近联系的朋友的姓名和电话放在大脑里一样)。现在,我们就来研究这样一种缓存机制。

LRU缓存:

LRU缓存利用了这样的一种思想。LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,也就是说,LRU缓存把最近最少使用的数据移除,让给最新读取的数据。而往往最常读取的,也是读取次数最多的,所以,利用LRU缓存,我们能够提高系统的performance.

实现:

要实现LRU缓存,我们首先要用到一个类LinkedHashMap。 用这个类有两大好处:一是它本身已经实现了按照访问顺序的存储,也就是说,最近读取的会放在最前面,最最不常读取的会放在最后(当然,它也可以实现按照插入顺序存储)。第二,LinkedHashMap本身有一个方法用于判断是否需要移除最不常读取的数,但是,原始方法默认不需要移除(这是,LinkedHashMap相当于一个linkedlist),所以,我们需要override这样一个方法,使得当缓存里存放的数据个数超过规定个数后,就把最不常用的移除掉。LinkedHashMap的API写得很清楚,推荐大家可以先读一下。

要基于LinkedHashMap来实现LRU缓存,我们可以选择inheritance, 也可以选择 delegation, 我更喜欢delegation。基于delegation的实现已经有人写出来了,而且写得很漂亮,我就不班门弄斧了。代码如下:


代码出自:http://www.source-code.biz/snippets/java/6.htm

下面有一个是用inheritance实现的,也贴出来。


代码出自:http://www.qqread.com/java/2010/10/w496122.html





分享到:
评论

相关推荐

    Java实现LRU缓存机制:深入解析与高效编码实践

    本文将详细介绍如何在Java中实现LRU缓存机制,包括其原理、实现方式以及编码实践。 LRU缓存机制是一种非常实用的缓存淘汰策略,它在很多应用场景中都有广泛的应用。在Java中实现LRU缓存,可以通过使用LinkedHashMap...

    Java实现LRU算法.zip

    通过以上代码,我们已经构建了一个简单的LRU缓存系统。在实际应用中,LRU算法不仅可以用于操作系统中的页面替换,还可以应用于数据库查询缓存、编程语言的内存管理(如Java的SoftReference和WeakReference)以及Web...

    LRU算法 java实现

    在Java中,我们可以使用数据结构如HashMap和LinkedList来实现LRU缓存。 首先,我们需要一个双向链表来保存缓存中的元素,链表的节点包含元素的键值对以及前后节点的引用。链表的顺序反映了元素的使用情况,最近使用...

    Java实现简单LRU缓存算法

    这里的LRUCache类维护了一个双向链表和一个哈希表,用于实现LRU算法。具体实现细节如下: - get方法:首先在哈希表中查找对应的键值对,如果不存在,则返回-1;如果存在,则将对应的节点从双向链表中删除,并将其...

    Java实现LRU缓存的实例详解

    Java实现LRU缓存的实例详解 Java实现LRU缓存的实例详解是指通过Java语言实现一种高效的缓存机制,即LRU(Least Recently Used)缓存。LRU缓存是一种常用的缓存策略,其主要思想是将最近使用的数据存储在缓存中,...

    详解Java实现LRU缓存

    Java 实现 LRU 缓存有多种方法,本文将介绍使用 LinkedHashMap 实现 LRU 缓存的方法。 LRU 缓存原理 LRU 缓存的原理很简单,就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉。例如,我们缓存 ...

    Java实现简单LRU缓存机制的方法

    Java实现简单LRU缓存机制的方法 Java实现简单LRU缓存机制的方法是指通过Java语言实现的一种缓存机制,该机制可以根据最近最少使用的原则淘汰缓存中的数据。缓存机制的实现主要是通过哈希表和双向链表来实现的。 ...

    LRU 缓存机制(java代码).docx

    在实现 LRU 缓存机制时,通常会采用哈希表(如 Java 中的 HashMap)与双向链表相结合的方式来实现。其中: - **哈希表**:用于快速查找和访问缓存中的元素。 - **双向链表**:用于维持缓存中元素的顺序,并支持高效...

    缓存淘汰算法之LRU

    LRU 算法的实现最常见的是使用一个链表保存缓存数据。详细算法实现如下: 1. 新数据插入到链表头部; 2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部; 3. 当链表满的时候,将链表尾部的数据丢弃。 3...

    java 缓存 cache lru 实例

    java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例

    LRU算法LRU算法LRU算法LRU算法

    在Java中,实现LRU算法可以使用`java.util.LinkedHashMap`类,它内部已经实现了LRU的逻辑。通过设置`accessOrder`参数为`true`,`LinkedHashMap`会按照访问顺序进行排序,从而实现LRU的效果。 总结一下,LRU算法是...

    实现了LRU算法的缓存

    在这个Java实现的LRU缓存中,我们可能会看到以下几个关键知识点: 1. **数据结构的选择**: LRU缓存通常基于哈希表和双向链表实现。哈希表用于快速查找,而双向链表则用来维护元素的顺序性,以便于执行删除和插入...

    Lru缓存代码

    在压缩包文件`Lruch`中,可能包含了LRU缓存的具体实现代码,比如用C++、Java、Python或其他编程语言编写的LRUCache类。通过对这些代码的学习和理解,开发者可以掌握如何设计和实现自己的LRU缓存系统,从而在实际项目...

    LRU_缓存策略_LRU_缓存.zip

    Java中,可以使用`java.util.LinkedHashMap`类,通过设置`accessOrder`为`true`来实现LRU缓存。Python中,有第三方库`functools.lru_cache`提供了内置的LRU缓存功能。在C++中,可以自定义数据结构来实现LRU缓存。 ...

    LRU.rar_LRU_LRU java_lru.java

    在这个Java实现的LRU算法示例中,我们将深入探讨LRU的核心概念、如何在Java中实现以及可能的应用场景。 1. LRU算法原理: LRU算法的基本思想是:如果一个数据最近被访问过,那么将来被访问的可能性会更高。在内存...

    Java利用ConcurrentHashMap实现本地缓存demo

    Java利用ConcurrentHashMap实现本地缓存demo; 基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~

    java-leetcode题解之第146题LRU缓存.zip

    总的来说,Java实现LRU缓存涉及的主要知识点包括:HashMap和LinkedList数据结构的理解与应用,自定义数据结构的设计,以及高效算法的实现。通过解决这道LeetCode题目,可以提升对这些概念的理解和实战能力。

    java实现lru

    根据提供的文件信息,我们可以深入探讨如何使用简单的数组来实现LRU(Least Recently Used,最近最少使用)缓存淘汰策略,并且解析代码中的具体实现细节。 ### LRU算法简介 LRU算法是一种常用的缓存淘汰策略,当...

    LRU.rar_LRU java

    - `LRU`类:定义了LRU缓存结构,包括初始化容量、put方法和get方法。 - `put`方法:处理添加或更新数据的操作,并维护链表顺序。 - `get`方法:获取数据并更新访问顺序。 - 测试类`LRUTest`:可能包含了测试用例,...

Global site tag (gtag.js) - Google Analytics