在使用redis作缓存的时候,咱们经常会设置过时时间。那么redis是如何清理这些过时的数据呢?java
答案是: 按期删除 + 惰性删除redis
随机
抽查删除过时的数据。可是这种方法有时候会留下大量过时但没有被抽查到的过时数据,白白浪费内存。听上去按期删除+惰性删除好像很完美的样子,but过时的数据用户又没有及时访问,那么内存中仍是会存在大量的过时数据。此时应该采用redis内存淘汰机制。算法
上面六种你能够这么记:缓存
通常经常使用allKeys-lrudom
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()); } } }
结果ide
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算法就实现了this
super(maxCapacity, DEFAULT_LOAD_FACTOR, true);
调用的是父类的code
public LinkedHashMap(int var1, float var2, boolean var3) { super(var1, var2); this.accessOrder = var3; }
accessOrder为true表示会把最新访问的数据放到最后一个节点,默认falseblog