LRU缓存算法-基于LinkedHashMap实现

核能气质少年 提交于 2020-03-06 18:30:38

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

    于是问题来了,不可能每个网站都存在内存里啊,虽然现在开发阶段没几个网站。这就需要在存新网站数据时清除内存中某些网站的数据,清除谁?我想到了操作系统中的一种页面置换算法——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缓存管理就这样完成。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!