在使用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