LRU算法:
LRU(Least Recently Used)今天在缓存内存淘汰策略中看到,觉得非常有意思,这里做一下笔记,不喜互喷。
LRU原理:
当数据在最近一段时间内不常被访问,在缓存定义的内存容量超过限制的时候,会将这部分数据淘汰掉;相反一段经常被访问的数据,说明这部分数据以后有很大可能也会被访问,需要快速匹配上这部分数据,也就是按频率决定存储的先后位置,方便快速查找高频数据和在空间不足的情况下删除低频数据,释放空间。
图片来自: https://baijiahao.baidu.com/s?id=1607586455640069632&wfr=spider&for=pc
LRU实现(基于LinkedHashMap实现):
定义使用LRU算法的缓存类LRUCache
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int CACHE_SIZE;
public LRUCache(int cacheSize) {
//第三个参数acessOrder是用来根据访问顺序进行排序,最新的会在链表前面
super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
this.CACHE_SIZE = cacheSize;
}
/**
* 回调方法,调用put添加键值对,回调方法会返回true
* 若超过容量,false移除map最老的键值对
*
* @param eldest
* @return
*/
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > CACHE_SIZE;
}
}
定义测试方法LRUCacheTest
public class LRUCacheTest {
public static void main(String[] args) {
LRUCache<Long, Integer> lruCache = new LRUCache<>(10);
//初始化键值对
for (int i = 0; i < 15; i++) {
lruCache.put(System.currentTimeMillis() + i, i);
System.out.println("第[" + i + "]次插入,缓存中存放的数据:" + lruCache);
}
}
}
输出运行结果
第[0]次插入,缓存中存放的数据:{
1645014382313=0}
第[1]次插入,缓存中存放的数据:{
1645014382313=0, 1645014382314=1}
第[2]次插入,缓存中存放的数据:{
1645014382313=0, 1645014382314=1, 1645014382315=2}
第[3]次插入,缓存中存放的数据:{
1645014382313=0, 1645014382314=1, 1645014382315=2, 1645014382320=3}
第[4]次插入,缓存中存放的数据:{
1645014382313=0, 1645014382314=1, 1645014382315=2, 1645014382320=3, 1645014382321=4}
第[5]次插入,缓存中存放的数据:{
1645014382313=0, 1645014382314=1, 1645014382315=2, 1645014382320=3, 1645014382321=4, 1645014382322=5}
第[6]次插入,缓存中存放的数据:{
1645014382313=0, 1645014382314=1, 1645014382315=2, 1645014382320=3, 1645014382321=4, 1645014382322=5, 1645014382323=6}
第[7]次插入,缓存中存放的数据:{
1645014382313=0, 1645014382314=1, 1645014382315=2, 1645014382320=3, 1645014382321=4, 1645014382322=5, 1645014382323=6, 1645014382324=7}
第[8]次插入,缓存中存放的数据:{
1645014382313=0, 1645014382314=1, 1645014382315=2, 1645014382320=3, 1645014382321=4, 1645014382322=5, 1645014382323=6, 1645014382324=7, 1645014382325=8}
第[9]次插入,缓存中存放的数据:{
1645014382313=0, 1645014382314=1, 1645014382315=2, 1645014382320=3, 1645014382321=4, 1645014382322=5, 1645014382323=6, 1645014382324=7, 1645014382325=8, 1645014382326=9}
第[10]次插入,缓存中存放的数据:{
1645014382314=1, 1645014382315=2, 1645014382320=3, 1645014382321=4, 1645014382322=5, 1645014382323=6, 1645014382324=7, 1645014382325=8, 1645014382326=9, 1645014382327=10}
第[11]次插入,缓存中存放的数据:{
1645014382315=2, 1645014382320=3, 1645014382321=4, 1645014382322=5, 1645014382323=6, 1645014382324=7, 1645014382325=8, 1645014382326=9, 1645014382327=10, 1645014382328=11}
第[12]次插入,缓存中存放的数据:{
1645014382320=3, 1645014382321=4, 1645014382322=5, 1645014382323=6, 1645014382324=7, 1645014382325=8, 1645014382326=9, 1645014382327=10, 1645014382328=11, 1645014382329=12}
第[13]次插入,缓存中存放的数据:{
1645014382321=4, 1645014382322=5, 1645014382323=6, 1645014382324=7, 1645014382325=8, 1645014382326=9, 1645014382327=10, 1645014382328=11, 1645014382329=12, 1645014382330=13}
第[14]次插入,缓存中存放的数据:{
1645014382322=5, 1645014382323=6, 1645014382324=7, 1645014382325=8, 1645014382326=9, 1645014382327=10, 1645014382328=11, 1645014382329=12, 1645014382330=13, 1645014382331=14}