`

Java实现简单的LRU缓存

阅读更多

应用程序经常需要在内存里缓存一些数据。Java最常用的类是HashMapHashtable 。如果需要做一些更复杂的缓存,你可以使用JBoss Cache, OSCache或者EHCache。即使是使用其他的缓存系统,你可能仍然想要在本地用对象缓存一些数据,以便快速访问。在做这些缓存的时候经常会遇到一个令人讨厌的问题,就是要很小心的控制缓存大小以防止其占用过多内存的,如果缓存不停的增长就会影响程序的性能。

一个简单的解决方法就是给内存缓存设置一个最大的限制,采用LRU(最近最少使用)替换算法进行替换。这种方法可以对内存使用有个预期并且只在缓存里存储最近的使用过的数据。

自从JDK1.4,一种新的集合类LinkedHashMap被引入进来。LinkedHashMap有很多优点:

l 它能维持数据项的顺序。一个专门的构造函数(LinkedHashMap(Map<? extends K,? extends V> m) )可以实现遍历的顺序和插入的顺序可以保持一致。这个场景下用TreeMap就比较贵了。

l 它还有个removeEldestEntry(Map.Entry)方法,可以重写这个方法来表明替换的策略,这就是我们用来创建LRU缓存的主要方法。

Ok,下面是一段使用LinkedHashMap实现的LRU缓存:

  1. import java.util.*;    
  2.     
  3. public class SimpleLRU {    
  4.     
  5.   private static final int MAX_ENTRIES = 50;    
  6.     
  7.   private Map mCache = new LinkedHashMap(MAX_ENTRIES, .75F, true) {    
  8.     protected boolean removeEldestEntry(Map.Entry eldest) {    
  9.       return size() > MAX_ENTRIES;    
  10.     }    
  11.   };    
  12.     
  13.   public SimpleLRU() {    
  14.     for(int i = 0; i < 100; i++) {    
  15.       String numberStr = String.valueOf(i);    
  16.       mCache.put(numberStr, numberStr);    
  17.     
  18.       System.out.print("\rSize = " + mCache.size() + "\tCurrent value = " + i + "\tLast Value in cache = " + mCache.get(numberStr));    
  19.       try {    
  20.         Thread.sleep(10);    
  21.       } catch(InterruptedException ex) {    
  22.       }    
  23.     }    
  24.     
  25.     System.out.println("");    
  26.   }    
  27.     
  28.   public static void main(String[] args) {    
  29.     new SimpleLRU();    
  30.   }    
  31. }   

这段代码创建了一个包含50个长度的简单的LRU缓存的实现。代码最神奇的部分就是在创建LinkedHashMap时,使用了true参数来表示维持访问顺序,并且重写了removeEldestEntry方法。运行程序,就可以看到cache size不断增加直到50,就不再增加,而开始替换最近最少使用的值。最后显示如下:

Size = 50       Current value = 99      Last Value in cache = 99

分享到:
评论

相关推荐

    Java实现简单LRU缓存算法

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

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

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

    Java实现LRU算法.zip

    总的来说,Java实现LRU算法的关键在于利用数据结构特性来跟踪页面的使用频率,通过淘汰最近最少使用的页面来优化内存使用。通过学习和理解LRU算法的实现,我们可以更好地理解和处理内存限制问题,提高系统的性能和...

    Java实现LRU缓存的实例详解

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

    详解Java实现LRU缓存

    Java 实现 LRU 缓存 LRU 缓存是指 Least Recently Used 缓存,翻译过来就是“最近最少使用”,它是一种常用的缓存策略。 Java 实现 LRU 缓存有多种方法,本文将介绍使用 LinkedHashMap 实现 LRU 缓存的方法。 LRU ...

    LRU算法 java实现

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

    Java利用ConcurrentHashMap实现本地缓存demo

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

    实现了LRU算法的缓存

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

    java map 实现缓存技术

    总的来说,Java Map提供了一种简单而有效的方式实现缓存技术。开发者可以根据具体需求选择合适的Map实现,并结合各种策略来管理和维护缓存,以提升系统的响应速度和效率。在实际应用中,还可以考虑使用第三方库如...

    java实现lru

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

    Java对象缓存系统的实现,实现了LRU算法,并可以进行集群同步

    `LRUCache.java`文件中应包含了实现LRU算法的数据结构,如双向链表结合哈希映射,以及添加、删除和查找操作,确保高效地执行这些操作。 **Java缓存实现** 在`Cache.java`文件中,可能定义了基础的缓存接口或抽象类...

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

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

    Cache:在 Java 中实现 LRU 缓存

    本文将深入探讨如何在Java中实现LRU缓存。 首先,理解LRU策略的基本思想:当缓存满时,最近最少使用的项将被移除以腾出空间给新的数据。LRU缓存的关键在于快速定位到最近最少使用的元素并高效地进行替换。 在Java...

    LRU_缓存策略_LRU_缓存.zip

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

    Lru缓存代码

    标题中的“Lru缓存代码”指的是实现LRU缓存机制的源代码,可能是用特定编程语言编写的。通过这段代码,开发者可以创建一个能够在内存中保存最近最常用数据的缓存结构。 描述中的“lru资源缓存”可能是指利用LRU策略...

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

    下面详细介绍如何使用 Java 实现一个简单的 LRU 缓存机制。 ##### 1. 定义双向链表节点类 `Node` ```java class Node { int key; int value; Node prev; Node next; public Node(int key, int value) { ...

    缓存淘汰算法之LRU

    LRU 算法的实现简单,但命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部。 4. LRU-K 算法 LRU-K 算法是为了解决 LRU 算法“缓存污染”的问题,其核心思想是将“最近使用过 1 次”的判断标准...

    Java和Android的Lru缓存及其实现原理

     Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存。Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的LRULinkedHashMap是直接继承了LinkedHashMap,进行了极少的改动后可以实现LRU...

Global site tag (gtag.js) - Google Analytics