概述
- 最近刚好有个述求是希望实时维护社区最常被访问的达人列表作为推荐数据源,前置流程我通过Redis里的HyperLogLog已经计算了各达人主页的PV、UV,故只剩下一个类似LRU机制的达人列表要持久化维护了
- 复习下LRU的原理:LRU原理及实现
实现
- 可以基于HashMap及LinkedList自己手写,也可以通过继承LinkedHashMap来设计,这里给出两种简单的实现方案:
public class LRUCache {
private Map<Integer, Integer> keys = new HashMap<>();
private List<Integer> visited = new LinkedList<>();
private int cap;
private int num = 0;
public LRUCache(int capacity) {
this.cap = capacity;
}
public int get(int key) {
if (!keys.containsKey(key)) {
return -1;
}
visited.remove((Integer)key);
visited.add(key);
return keys.get(key);
}
public void put(int key, int value) {
if (keys.containsKey(key)) {
visited.remove((Integer)key);
} else if (num < cap) {
num++;
} else {
keys.remove(visited.get(0));
visited.remove(0);
}
keys.put(key, value);
visited.add(key);
}
}
private class LRUInnerCache extends LinkedHashMap<Integer, Integer> {
private int cap;
LRUInnerCache(int cap) {
super(cap, 0.75f, true);
this.cap = cap;
}
public int get(int key) {
Integer value = super.get(key);
if (value == null) {
return -1;
}
return value;
}
public void put(int key, int value) {
super.put(key, value);
}
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return this.size() > cap;
}
}