LRU缓存算法-基于LinkedHashMap实现
2016-03-24 00:00
381 查看
摘要: 通过继承LinkedHashMap,重写removeEldestEntry()方法,实现近期最少使用(LRU)算法,用于内存管理。
近期再做一个项目,是个网站管理系统,涉及多张记录表和栏目表,简单实现网站首页访问后发现速度很忧伤。仔细一想,每次访问,要查询各种表,访问数据库次数太多了,而且很多表里的数据其实在实际中不常改变,所以想到读取后存储在内存中,下次直接返回。
于是问题来了,不可能每个网站都存在内存里啊,虽然现在开发阶段没几个网站。这就需要在存新网站数据时清除内存中某些网站的数据,清除谁?我想到了操作系统中的一种页面置换算法——LRU(Least Recently Used)近期最少使用算法。
显然HashMap不够用了,我能想到最简单的方法就是用LinkedHashMap,他的一个构造函数:
关键在最后一个参数,只要设置为true,就会以访问顺序排序,这就是实现LRU算法的基础,接下来只要再重写removeEldestEntry(Map.Entry<K, V> eldest) 方法就可以了。
因为要重写方法,所以新建一个类继承LinkedHashMap:
一个简单的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缓存管理就这样完成。
相关文章推荐
- Redis的LRU机制介绍
- Python实现LRU算法的2种方法
- InnoDB存储引擎的内存管理机制
- LruCache,DiskLruCache实现相关研究记录
- OCP知识点讲解 之 LRU链与脏LRU链
- LinkedHashMap的一个应用场景
- hashmap hashtable 的区别
- LRU Cache
- LinkedHashMap和HashMap的区别以及使用方法
- LeetCode:LRU Cache
- LRU链与脏LRU链
- LRU算法实现
- LRU 算法
- LRUCache
- 将Map的内容按value排序
- Android之Lru缓存
- Java深入集合--linkedHashMap
- LinkedHashMap和HashMap的比较使用
- redis lru缓存清理算法详解和相关配置
- Java集合之LinkedHashMap