layout: post title: "算法之最近最少使用LRU" subtitle: " "1.HashMap,存放数据 2.双向链表节点,确保最新被使用的节点在链表头 3.缓存已满,从链表尾删除节点 "" date: 2018-11-11 07:00:00 author: "青乡" header-img: "img/post-bg-2015.jpg" catalog: true tags: - DataStructure&Algorithm - cache - 缓存 - LRU
是什么
1.缓存已满
要删除数据
2.删除的算法
就是最近最少使用算法。//Least Recent Use(LRU)
应用场景
缓存系统。//1.memcache 2.自己实现
怎么实现
总结一下核心操作的步骤:
1.add(key, value)
首先在 HashMap 找到 Key 对应的节点,如果节点存在,更新节点的值,并把这个节点移动队头。如果不存在,需要构造新的节点,并且尝试把节点塞到队头,如果LRU空间不足,则通过 tail 淘汰掉队尾的节点,同时在 HashMap 中移除 Key。
2.get(key)
通过 HashMap 找到 LRU 链表节点,因为根据LRU原理,这个节点是最新访问的,所以要把节点插入到队头,然后返回缓存的值。
数据结构
1.如何存放数据
map //HashMap
2.如何知道哪个数据最近最少使用?
链表 //双向 //自己实现双向链表节点(key,value,前置节点,后置节点)
注:LinkedList是数组 + 双向链表(节点)。
写数据
1.没有 //添加
2.有 //覆盖
3.缓存已满 //1.删除旧的数据(从链表尾删除) 2.添加数据
以上任何一种情况,添加数据到map之后,都需要插入节点到链表头。
读数据
1.读数据
2.把读到的数据,插入到链表头 //头的数据,表示最新被使用过的数据