LRU算法介绍
1.LRU算法
1.一种缓存删除算法机制(采用算法删除缓存中多余或低概率会访问的部分)
2.Least Recently Used (最近使用策略,即算法认为最近使用的内容再次访问的概率大,距离使用的时间越长,访问的概率越大,算法优先删除最长时间未使用的缓存)
3.将缓存区域看做一个有一定容量的双端队列,当一个缓存被使用时就被放在队首位,一个新加的数据也被放到队首,当缓存满了之后,再加入数据时,将从队尾删除数据
-> | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -> |
---|
2.使用数据结构实现
操作缓存的数据结构:
缓存的操作要求读取速度快,所以读取的结构使用K-V值方式的Hash表,使其能够快速查找
队列要求能够方便删除和添加操作,使用双向链表的结构
链表节点
class Node{
public int key, val;
public Node next, pre;//双向链表
public Node(int key, int val){
this.key = k;
this.val = val;
}
}
class LRU{
//哈希表
HashMap<Integer, Node> map;
//双向链表
DoubleList cache;
private int cap;
//构造函数
public LRU(int cap){
this.cap = cap;
map = new HashMap<>();
cache = new DoubleList();
}
public int get(int key){
//访问缓存不存在
if(!map.containsKey(key))
return -1;
int val = map.get(key).val;
//将该值提前
put(key,val);
return val;
}
public put(int key, int val){
Node newNode = new Node(key, val);
if(map.containsKey(key)){
Node p = map.get(key);
//从链表中删除该节点
cache.remove(p);
//将该节点加入到链表首部
cache.addFirst(newNode);
} else {
if(cap==cache.size()){
//队列满了
Node last=cache.removeLast();
//!map中删除对应值
map.remove(last.key);
}
cache.addFirst(newNode);
map.put(key, newNode);
}
}
}