`

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利用ConcurrentHashMap实现本地缓存demo

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

    详解Java实现LRU缓存

    主要介绍了详解Java实现LRU缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java实现LRU缓存的实例详解

    主要介绍了Java实现LRU缓存的实例详解的相关资料,这里提供实例帮助大家理解掌握这部分内容,需要的朋友可以参考下

    Cache:在 Java 中实现 LRU 缓存

    缓存 在 Java 中实现 LRU 缓存

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

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

    实现了LRU算法的缓存

    用Java写的一个Cache,内部实现了LRU算法~

    Java和Android的LRU缓存及实现原理

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

    LRU缓存HashMap+双向链表

    LRU缓存HashMap+双向链表实现,java版本,导入即用

    浅谈Java如何实现一个基于LRU时间复杂度为O(1)的缓存

    主要介绍了浅谈Java如何实现一个基于LRU时间复杂度为O(1)的缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

    NULL 博文链接:https://jimi68.iteye.com/blog/440892

    详解Java实现缓存(LRU,FIFO)

    本篇文章主要介绍了详解Java实现缓存(LRU,FIFO) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    JAVA缓存概念体系及应用

    该压缩包中有一个WORD和一个PPT,WORD中介绍了通过单实例和简单LRU算法实现缓存。PPT中介绍了缓存体系,JVM内存模型,JCONSOLE监控工具的使用,Oscache缓存架构 Ehcache缓存架构 Memcached缓存架构 JiveCache缓存架构...

    javalruleetcode-JavaCache:具有可配置驱逐策略(LRU或LFU)的缓存实现

    java lru leetcode 缓存 具有可配置驱逐策略(LRU 或 LFU)的缓存实现 LRU 策略的灵感来自 SO 的这个解决方案: LFU 策略是使用这种方法实现的,时间复杂度为 O(1):

    10行Java代码实现近被使用(LRU)缓存

    在近的面试中,我曾被多次问到,怎么实现一个近少使用(LRU)的缓存。缓存可以通过哈希表来实现,然而为这个缓存增加大小限制会变成另一个有意思的问题。现在我们看一下怎么实现。  近少使用缓存的回收  为了...

    java LRU(Least Recently Used )详解及实例代码

    主要介绍了java LRU(Least Recently Used )详解及实例代码的相关资料,Java里面实现LRU缓存通常有两种选择,一种是使用LinkedHashMap,一种是自己设计数据结构,使用链表+HashMap,需要的朋友可以参考下

    cache4j:轻量级java内存缓存框架,实现FIFO、LRU、TwoQueues缓存模型

    cache4j是一款轻量级java内存缓存框架,实现FIFO、LRU、TwoQueues缓存模型,使用非常方便。 cache4j为java开发者提供一种更加轻便的内存缓存方案,杀鸡焉用EhCache? 特性 支持并发。 使用简单。 因为简单,所以通用...

Global site tag (gtag.js) - Google Analytics