设计LRU缓存结构(Java实现)

本文介绍了LRU缓存淘汰算法的基本概念,常见应用场景,并详细阐述了使用Java实现LRU缓存的步骤。通过定义List>结构,实现了缓存数据的增删查改,并保持热点数据在列表前端。" 105760501,9479603,Java中List与ArrayList的向上转型与向下转型解析,"['Java编程', '面向对象', '泛型', '设计模式', '类型转换']
摘要由CSDN通过智能技术生成
(1)是什么?

Least Recently Used (最近最少使用)
缓存淘汰算法中的一种。因为缓存是保存在内存中的,内存是很吃紧很宝贵的,所以要保证最热点的数据做缓存,冷门数据淘汰。

(2)具体在哪些场景使用?

Mysql的缓冲池,Linux OS 的虚拟文件系统VFS都有用到。

(3)具体实现步骤?

既然是缓存,那肯定就是List中存放着一大串 Key - Value 结构,我们查找目标数据的时候就是for这个List找到对应的Key,这个List可能很长,所以我们可以把热点数据排到较前面,冷门的放后面,如果超过了长度,就淘汰,移除缓存List。

传统的LRU如下:

(1)首先定义一条链表List,初始化之初,它连续加载1~6的磁盘块到缓存中
1->2->3->4->5->6 六个page cache缓存页

(2)查询3,则3的page cache命中,遍历List并且将3移至头部(加快下次检索速度)
3->1->2->4->5->6

(3)查询7,发现缓存链表中没有page cache 命中,则读磁盘,并将7加入到缓存List头部,剔除掉列尾元素6
7->3->1->2->4->5

(4)牛客也是有道LRU的算法题,描述的也是这个思路:

在这里插入图片描述

(5)思路很清晰,也比较好做,代码实现:

首先是比较简单的调用方法:

在这里插入图片描述

public class SplitApplication {
   
    private static List resultArray = new ArrayList();
    public static void main(String[] args) {
   
        int[][] twoArray = new int[][]{
   {
   1,1,1},{
   1,2,2},{
   1,3,3},{
   2,1},{
   1,4,4},{
   2,2}};
        int listSize = 3;
        testLRU(twoArray, listSize);
    }

    public static void
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值