文档章节

LRU缓存算法-基于LinkedHashMap实现

一杯82年的JAVA
 一杯82年的JAVA
发布于 2016/03/24 18:18
字数 476
阅读 213
收藏 7

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

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

© 著作权归作者所有

一杯82年的JAVA
粉丝 8
博文 76
码字总数 36575
作品 0
杭州
程序员
私信 提问
Android LRUCache原理及使用(对象软引用不行,使用LRU算法)

> 对象软引用,弱引用 A a = new A(); SoftReference sr = new SoftReference(a); a = sr.get(); > LRUCache原理及使用 在Android中采用LRU算法的常用缓存有两种:LruCache和DisLruCache,分......

desaco
01/25
0
0
LinkedHashMap的最近最少使用(LUR)算法实践

固定容量的基于最近最少使用算法的LinkedHashMap.可用作简单缓存.使用方法与LinkedHashMap一致. 利用LinkedHashMap实现简单的缓存,必须实现removeEldestEntry方法,具体参见JDK文档.另外...

小克898
2014/02/27
192
0
Android缓存机制——LruCache

Android缓存机制——LruCache LruCache的核心原理就是对LinkedHashMap的有效利用,它的内部存在一个LinkedHashMap成员变量,值得注意的4个方法:构造方法、get、put、trimToSize LRU(Least ...

优惠码发放
04/28
0
0
LinkedHashMap原理分析

本文主要内容 LinkedHashMap使用 LinkedHashMap源码解析 Lru算法 今天打算看看android的图片缓存相关知识点,没想到引申到了LinkedHashMap容器了。 LinkedHashMap继承HashMap,相比于HashMap...

某昆
2018/06/05
0
0
设计实现一个LRU Cache

1 什么是LRU Cache 在LeetCode上有一个LRU Cache实现的题目 Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: g......

芥末无疆
2018/04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于java中变量的重名问题

在java语言中,变量的命名有很多规则和规范,但是有的地方可以使用相同的变量名,有的地方却不能使用,这是为什么呢? 下面是个人的一点见解,是从作用域和内存来分析的,目的是为了方便理解...

INEVITABLE
16分钟前
4
0
MySQL的COUNT语句,竟然都能被面试官虐的这么惨?

数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查。 在数据库的增删改查操作中,使用最频繁的就是查询操作。而在所有查询操作中,...

程序员修BUG
19分钟前
4
0
PHP+Mysql统计文件下载次数实例

PHP+Mysql统计文件下载次数实例,实现的原理也很简单,是通过前台点击链接download.php传参id,来更新点击次数。 获取文件列表: <?php require 'conn.php'; $query = mysql_query("S...

ymkjs1990
20分钟前
3
0
一、环境变量及Jshell

一、环境变量: 作用: 可执行文件所在位置的链接。CLI输入命令时,通过环境变量指引找到命令所在位置 windows的环境变量名不区分大小写,Linux区分 Windows下的用户变量即只有当前用户生效 ...

清自以敬
21分钟前
4
0
微软改名部又出手:Office 365正在悄悄更名为Microsoft 365

然而让人疑惑的是Microsoft 365 是微软面向企业提供的服务,这项服务附带操作系统以及办公软件的订阅授权。 现在把面向家庭消费者的办公软件也换成Microsoft 365 是什么操作?没人知道因为微...

linuxCool
21分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部