1、redis的過時策略和內存淘汰機制 html
一、按期刪除+惰性刪除java
按期刪除:指的是redis默認是每隔100ms就隨機抽取一些設置了過時時間的key,檢查其是否過時,若是過時就刪除redis
惰性刪除:在你獲取某個key的時候,redis會檢查一下 ,這個key若是設置了過時時間那麼是否過時了,若是過時了此時就會刪除,不會給你返回任何東西數組
二、若是大量過時key堆積在內存裏,致使redis內存塊耗盡了,怎麼辦?緩存
內存淘汰機制:dom
redis.conf中配置:ide
# maxmemory-policy noeviction
noeviction:當內存使用達到閾值的時候,全部引發申請內存的命令會報錯。this
allkeys-lru:在主鍵空間中,優先移除最近未使用的key。url
volatile-lru:在設置了過時時間的鍵空間中,優先移除最近未使用的key。spa
allkeys-random:在主鍵空間中,隨機移除某個key。
volatile-random:在設置了過時時間的鍵空間中,隨機移除某個key。
volatile-ttl:在設置了過時時間的鍵空間中,具備更早過時時間的key優先移除。
2、手寫LRU緩存
public class LRUCache { private Map<Integer, Integer> map; private final int capacity; public LRUCache(int capacity) { this.capacity = capacity; //定義了迭代順序,該迭代順序能夠是插入順序或者是訪問順序(true) map = new LinkedHashMap<Integer, Integer>(capacity,0.75f,true){ @Override protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) { //當map中的數據量大於指定的緩存個數的時候,就自動刪除最老的數據 return size() > capacity; } }; } public int get(int key) { return map.getOrDefault(key, -1); } public void put(int key, int value) { map.put(key, value); } }
LinkedHashMap的源碼說明 :
對於 LinkedHashMap 而言,它繼承與 HashMap(public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
)、
底層使用哈希表與雙向鏈表來保存全部元素。
LinkedHashMap 中的 Entry 集成與 HashMap 的 Entry,可是其增長了 before 和 after 的引用,指的是上一個元素和下一個元素的引用
static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } }
初始化:
在 LinkedHashMap 的構造方法中,實際調用了父類 HashMap 的相關構造方法來構造一個底層存放的 table 數組,但額外能夠增長 accessOrder 這個參數,若是不設置,默認爲 false,表明按照插入順序進行迭代;固然能夠顯式設置爲 true,表明以訪問順序進行迭代
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; }