LRU:Least Recently used 最近最少使用

1.使用LinkedHashMap实现 inheritance实现方式 继承map类 可以使用Collections.synchronizedMap方式实现线程安全的操作

public class LruCache<K,V> extends LinkedHashMap<K,V> {
private final int MAX_CACHE_SIZE;
public LruCache(int cacheSize) {
super((int)Math.ceil(cacheSize/0.75)+1,0.75f,true );
MAX_CACHE_SIZE = cacheSize;
}
@Override
protected boolean removeEldestEntry(Map.Entry eldest){
return size()> MAX_CACHE_SIZE;
} @Override
public String toString(){
StringBuilder sb= new StringBuilder();
for(Map.Entry<K,V> entry : entrySet()){
sb.append(String.format("%s:%s",entry.getKey(),entry.getValue()));
}
return sb.toString();
}
}

2、LinkedHashMap 使用delegation方式实现

没有map接口

public class LruByDelegation<K,V> {

    private final int MAX_CACHE_SIZE;
private final float DEFAULT_LOAD_FACTOR = 0.75f;
LinkedHashMap<K,V> map; public LruByDelegation(int cacheSize) {
this.MAX_CACHE_SIZE = cacheSize; int capacity = (int) (Math.ceil(MAX_CACHE_SIZE/DEFAULT_LOAD_FACTOR)+1);
map= new LinkedHashMap(capacity,DEFAULT_LOAD_FACTOR,true){
@Override
protected boolean removeEldestEntry(Map.Entry eldest){
return size()>MAX_CACHE_SIZE;
}
};
} public synchronized void put(K key,V value){
map.put(key,value);
} public synchronized V get(K key){
return map.get(key);
}
public synchronized void remove(K key){
map.remove(key);
}
public synchronized Set<Map.Entry<K,V>> getAll(){
return map.entrySet();
}
public synchronized int size(){
return map.size();
}
public synchronized void clear(){
map.clear();
} @Override
public String toString(){
StringBuilder sb= new StringBuilder();
for(Map.Entry entry : map.entrySet()){
sb.append(String.format("%s:%s",entry.getKey(),entry.getValue()));
}
return sb.toString();
} }

2 Cache链表+HashMap实现   Entry自己定义  总结一下就是各种pre 和 next指针的变换

public class LruCache01<K,V> {
private final int MAX_CACHE_SIZE;
private Entry first;
private Entry last;
private HashMap<K, Entry<K,V>> hashMap; public LruCache01(int MAX_CACHE_SIZE) {
this.MAX_CACHE_SIZE = MAX_CACHE_SIZE;
hashMap=new HashMap<>();
}
public void put(K key, V value){
Entry entry = getEntry(key);
if(entry==null){
if(hashMap.size()>=MAX_CACHE_SIZE){
hashMap.remove(last.key);
//removeLast
removeLast();
}
entry=new Entry();
entry.key=key;
}
entry.value=value;
moveToFirst(entry);
hashMap.put(key,entry); }
public V get(K key){
Entry entry = getEntry(key);
if(entry==null)
return null;
moveToFirst(entry);
return (V) entry.value;
} public void remove(K key){
Entry entry = getEntry(key);
if(entry!=null){
if(entry.pre!=null)
entry.pre.next=entry.next;
if(entry.next!=null)
entry.next.pre=entry.pre;
if(entry==first)
first=entry.next;
if(entry==last)
last=entry.pre;
}
hashMap.remove(key);
}
public void moveToFirst(Entry entry){
if(entry==first)
return;
if(entry.pre!=null)
entry.pre.next=entry.next;
if(entry.next!=null)
entry.next.pre=entry.pre;
if(entry==last)
last=last.pre;
if(first==null || last==null){
first=last=entry;
return;
}
entry.next=first;
first.pre=entry;
first=entry;
entry.pre=null;
} public void removeLast(){
if(last!=null){
last=last.pre;
if(last==null)
first=null;
else
last.next=null;
}
} public Entry<K,V> getEntry(K key){
return hashMap.get(key);
} @Override
public String toString(){
StringBuilder sb= new StringBuilder();
Entry entry = first;
while(entry!=null){
sb.append(String.format("%s:%s",entry.key,entry.value));
entry=entry.next;
}
return sb.toString();
}
}
class Entry<K,V>{
public Entry pre;
public Entry next;
public K key;
public V value;
}

LinkedHashMap的FIFO实现

只需要重新removeEldestEntry方法可以实现FIFO缓存

final int cacheSize=5;
LinkedHashMap<Integer,String> lru = new LinkedHashMap<Integer,String>(){
@Override
protected boolean removeEldestEntry(Map.Entry<Integer,String> eldest){
return size()>cacheSize;}
}

LRU 实现缓存的更多相关文章

  1. LRU算法 缓存淘汰策略

    四种实现方式 LRU 1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也 ...

  2. Go -- LRU算法(缓存淘汰算法)(转)

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...

  3. 【面试题】LRU算法及编码实现LRU策略缓存

    概念 LRU(least recently used)就是将最近不被访问的数据给淘汰掉,LRU基于一种假设:认为最近使用过的数据将来被使用的概率也大,最近没有被访问的数据将来被使用的概率比较低. 原理 ...

  4. LeetCode题解: LRU Cache 缓存设计

    LeetCode题解: LRU Cache 缓存设计 2014年12月10日 08:54:16 邴越 阅读数 1101更多 分类专栏: LeetCode   版权声明:本文为博主原创文章,遵循CC 4 ...

  5. mybatis PageHelper分页插件 和 LRU算法缓存读取数据

    分页: PageHelper的优点是,分页和Mapper.xml完全解耦.实现方式是以插件的形式,对Mybatis执行的流程进行了强化,添加了总数count和limit查询.属于物理分页. 一.首先注 ...

  6. 重学数据结构(三)——使用单链表实现LRU淘汰缓存机制

    使用单链表实现LRU(Least Recently Used)淘汰缓存机制 需求:存在一个单链表,在单链表尾部的都是越早之前添加的元素. 当元素被访问到时,会添加进缓存(也就是这个单链表中). 如果这 ...

  7. 借助LinkedHashMap实现基于LRU算法缓存

    一.LRU算法介绍 LRU(Least Recently Used)最近最少使用算法,是用在操作系统中的页面置换算法,因为内存空间是有限的,不可能把所有东西都放进来,所以就必须要有所取舍,我们应该把什 ...

  8. 浅析LRU(K-V)缓存

    LRU(Least Recently Used)算法是缓存技术中的一种常见思想,顾名思义,最近最少使用,也就是说有两个维度来衡量,一个是时间(最近),一个频率(最少).如果需要按优先级来对缓存中的K- ...

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

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

随机推荐

  1. 通过VuePress管理项目文档(二)

    通过vue组件实现跟:Element相似的效果.需要在VuePress网站中将自己的项目中的Vue组件运行结果展示在页面中. 至于如何将组件在VuePress网站中展示请参考:https://segm ...

  2. python 元组用法

    tup1 = ('physics', 'chemistry', 1997, 2000) 元组中的元素值是不允许修改的 序号 方法及描述 1 cmp(tuple1, tuple2)比较两个元组元素. 2 ...

  3. springboot全局捕获异常

    捕获 捕获原理,使用AOP技术,采用异常通知. 1.捕获返回json格式 2.捕获返回页面 步骤: 1.@ControllerAdvice(pasePackage="") 注释异常 ...

  4. ios端阻止页面滚动露底

    转自 http://www.eboy.me/archives/129: 在IOS端的微信中使用H5页面,页面滑动到底部时,再向上拉或页面在顶部时下拉,总会露出微信自带的底色:总是会让人不爽. 以下是一 ...

  5. 网路知识总结(session&&Cookie&&三次握手&&请求头)

    1. 请说明Session和Cookie的作用和区别 1) Cookie 存在前端 前端需要拿着cookie访问后端,Session在服务器上(文件,数据库,如Redis) 2) web访问Serve ...

  6. 京东商品及评论爬虫(selenium)

    代码查看https://gitee.com/MarkPolaris/reptile/tree/master/jd 中的gly和demo03

  7. 商誉专题RN及H5项目总结

    React(基础框架): React 是基础框架,是一套基础设计实现理念,开发者不能直接使用它来开发移动应用或者网页. React.js(web网页开发):在React框架之上,发展出了React.j ...

  8. PHP7 中 ?? 与? :的区别

    ??是PHP7版本的新特性,它与?:的区别在哪里呢 ?? $b = $a?? $c ;相当于$b= isset($a)?$a:$c; ?: $b = $a?$a: $c 则是 $b = !empty( ...

  9. opencv+codeblocks +anaconda

    study from : https://www.jianshu.com/p/c16b7c870356 #include <cstdio> #include <cstdlib> ...

  10. atool-build 打包项目报JavaScript heap out of memory 错误

    出现这个问题的原因,是因为NodeJS给JavaScript设置了默认内存使用限制(32位系统下0.7GB,64位系统下1.4GB),就算我们的电脑内存是64GB的,在使用atool-build打包时 ...