redis的過時策略和內存淘汰機制

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;
    }

LinkedHashMap實現原理

相關文章
相關標籤/搜索