答案是: 定期删除 + 惰性删除
随机
抽查删除过期的数据。但是这种方法有时候会留下大量过期但没有被抽查到的过期数据,白白浪费内存。听上去定期删除+惰性删除好像很完美的样子,but过期的数据用户又没有及时访问,那么内存中还是会存在大量的过期数据。此时应该采用redis内存淘汰机制。
上面六种你可以这么记:
一般常用allKeys-lru
package com.amber;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> {
//最大容量
private final int maxCapacity ;
// 默认增长因子
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
public LRULinkedHashMap(int maxCapacity) {
super(maxCapacity, DEFAULT_LOAD_FACTOR, true);
this.maxCapacity = maxCapacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> entry) {
if(size()>maxCapacity)
return true;
else
return false;
}
public static void main(String[] args) {
LRULinkedHashMap<String, String> lruLinkedHashMap = new LRULinkedHashMap(5);
lruLinkedHashMap.put("1", "1");
lruLinkedHashMap.put("2", "2");
lruLinkedHashMap.put("3", "3");
lruLinkedHashMap.put("4", "4");
lruLinkedHashMap.put("5", "5");
Iterator<Map.Entry<String, String>> iterator = lruLinkedHashMap.entrySet().iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
lruLinkedHashMap.get("1");
System.out.println("超出最大容量");
lruLinkedHashMap.put("6", "6");
iterator = lruLinkedHashMap.entrySet().iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
结果
1=1
2=2
3=3
4=4
5=5
超出最大容量
3=3
4=4
5=5
1=1
6=6
Process finished with exit code 0
根据上述结果可以看到,当超出最大容量时移除的是第二个结点,而不是第一个结点,因此一个简单的lru算法就实现了
super(maxCapacity, DEFAULT_LOAD_FACTOR, true);
调用的是父类的
public LinkedHashMap(int var1, float var2, boolean var3) {
super(var1, var2);
this.accessOrder = var3;
}
accessOrder为true表示会把最新访问的数据放到最后一个节点,默认false
原文:https://www.cnblogs.com/jwcz/p/11772201.html