近期再做一个项目,是个网站管理系统,涉及多张记录表和栏目表,简单实现网站首页访问后发现速度很忧伤。仔细一想,每次访问,要查询各种表,访问数据库次数太多了,而且很多表里的数据其实在实际中不常改变,所以想到读取后存储在内存中,下次直接返回。
于是问题来了,不可能每个网站都存在内存里啊,虽然现在开发阶段没几个网站。这就需要在存新网站数据时清除内存中某些网站的数据,清除谁?我想到了操作系统中的一种页面置换算法——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缓存管理就这样完成。
来源:oschina
链接:https://my.oschina.net/u/2662344/blog/646868