缓存淘汰策略
Posted Alleria Windrunner
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存淘汰策略相关的知识,希望对你有一定的参考价值。
voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
no-enviction(驱逐):禁止驱逐数据。
class LRUCache {
private HashMap<Integer, Node> map;
private DoubleLinkedList cache;
private int capacity;
public LRUCache(int capacity) {
map = new HashMap<Integer, Node>();
cache = new DoubleLinkedList();
this.capacity = capacity;
}
public int get(int key) {
if (!map.containsKey(key)) {
return -1;
}
int value = map.get(key).value;
put(key, value);
return value;
}
public void put(int key, int value) {
Node x = new Node(key, value);
if (map.containsKey(key)) {
cache.remove(map.get(key));
} else {
if (capacity == cache.size()) {
Node last = cache.removeLast();
map.remove(last.key);
}
}
cache.addFirst(x);
map.put(key, x);
}
private class Node {
int key, value;
Node prev, next;
Node(int key, int value) {
this.key = key;
this.value = value;
}
}
private class DoubleLinkedList {
private Node head, tail;
private int size;
DoubleLinkedList() {
head = new Node(0, 0);
tail = new Node(0, 0);
head.next = tail;
tail.prev = head;
size = 0;
}
private void addFirst(Node x) {
x.next = head.next;
x.prev = head;
head.next.prev = x;
head.next = x;
size ++;
}
private void remove(Node x) {
x.prev.next = x.next;
x.next.prev = x.prev;
size --;
}
private Node removeLast() {
if (head.next == tail) {
return null;
}
Node last = tail.prev;
remove(last);
return last;
}
private int size() {
return size;
}
}
}
以上是关于缓存淘汰策略的主要内容,如果未能解决你的问题,请参考以下文章