Java实现FIFO/LRU缓存

一、概述

在学操作系统的时候,会接触到页面缓存调度算法。缓存不可能是无限大的,所以会涉及到一些置换策略,来保证缓存的命中率。常见的有:FIFO、LRU、LFU、OPT策略等。

1、缓存置换算法

  • FIFO: First In First Out,先进先出,和队列保持一致。最先进来的最早出去。
  • LRU: Least Recently Used,最近最少使用。总是淘汰最近没有使用的。其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”
    也就是说,淘汰最近一段时间内最长时间未访问过的数据。根据程序局部性原理,刚被访问的数据,可能马上又要被访问;而较长时间内没有被访问的数据,可能最近不会被访问。
  • LFU: Least Frequently Used,最近使用次数最少。即淘汰使用次数最少的。
  • OPT: Optimal,最佳置换。置换以后永不再被访问,或者在将来最迟才会被访问的。该算法无法实现,通常作为衡量其他算法的标准。

2、缓存置换算法的要素

  • (1)缓存不是无限大,需要有一个固定的大小来约束其大小
  • (2)缓存满后,再次插入需要替换掉某些元素,才能添加新元素
  • (3)每次访问完缓存,可能需要改变缓存元素的状态,如元素顺序的改变

3、Java LinkedHashMap简介

先看下LinkedHashMap的构造函数,三个参数分别为:初始化大小、装载因子和访问顺序。
- 当参数accessOrder = true时,则按照访问顺序对Map排序,那么调用get()方法后,会将这次访问的元素移至链表尾部。不断访问可以形成按访问顺序排序的链表。
- 当参数accessOrder = false时,则按照插入顺序对Map排序。先插入的元素放置在链表的首部,按照尾插入的方式维护链表。

public LinkedHashMap(int initialCapacity,
                         float loadFactor,
                         boolean accessOrder) {
        super(initialCapacity, loadFactor);
        this.accessOrder = accessOrder;
    }

根据链表中元素的顺序可以分为:按插入顺序的链表(默认,false),和按访问顺序的链表(调用get方法)。默认是按插入顺序排序,如果指定按访问顺序排序,那么调用get方法后,会将这次访问的元素移至链表尾部,不断访问可以形成按访问顺序排序的链表。 可以重写removeEldestEntry方法返回true值指定插入元素时移除最老的元素。

结论1:可以得出accessOrder = true时,可以模仿出LRU的特性;accessOrder = false时,可以模仿出FIFO的特性。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值