您的位置:首页 > 其它

LRU缓存算法-基于LinkedHashMap实现

2016-03-24 00:00 381 查看
摘要: 通过继承LinkedHashMap,重写removeEldestEntry()方法,实现近期最少使用(LRU)算法,用于内存管理。

近期再做一个项目,是个网站管理系统,涉及多张记录表和栏目表,简单实现网站首页访问后发现速度很忧伤。仔细一想,每次访问,要查询各种表,访问数据库次数太多了,而且很多表里的数据其实在实际中不常改变,所以想到读取后存储在内存中,下次直接返回。

于是问题来了,不可能每个网站都存在内存里啊,虽然现在开发阶段没几个网站。这就需要在存新网站数据时清除内存中某些网站的数据,清除谁?我想到了操作系统中的一种页面置换算法——LRU(Least Recently Used)近期最少使用算法。

显然HashMap不够用了,我能想到最简单的方法就是用LinkedHashMap,他的一个构造函数:

LinkedHashMap<K, V>(int initialCapacity, float loadFactor, boolean accessOrder)

Constructs an empty LinkedHashMap instance with the specified initial capacity,
load factor and ordering mode.

Parameters:
initialCapacity  the initial capacity
loadFactor       the load factor
accessOrder      the ordering mode - true for access-order, false for insertion-order


关键在最后一个参数,只要设置为true,就会以访问顺序排序,这就是实现LRU算法的基础,接下来只要再重写removeEldestEntry(Map.Entry<K, V> eldest) 方法就可以了。

因为要重写方法,所以新建一个类继承LinkedHashMap:

package com.swust.kelab.util;

import java.util.LinkedHashMap;
import java.util.Map;

public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> {

private static final long serialVersionUID = -7971438719252105001L;
private int capacity;// 容量

public LRULinkedHashMap(int capacity) {
super(16, 0.75f, true);
this.capacity = capacity;
}

// 实现LRU的关键方法,如果map里面的元素个数大于了缓存最大容量,则删除链表的顶端元素
@Override
public boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}


一个简单的LRU缓存管理就这样完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LinkedHashMap LRU