(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