redis的過時策略都有哪些?內存淘汰機制都有哪些?手寫一下LRU代碼實現?

redis的過時策略都有哪些?redis

設置過時時間:緩存

    set key 的時候,使用expire time,就是過時時間.指定這個key好比說只能存活一個小時?10分鐘?指定緩存到期就會失效.dom

  redis的過時策略的話ide

      按期刪除加惰性刪除性能

    按期刪除:redis默認是每隔100ms就會隨機抽取一些設置了過時時間的key,檢查其是否過時,若是過時就刪除,spa

        假設redis裏放了10萬個key,都設置了過時時間,你每隔幾百毫秒,就檢查10萬個key,那redis基本上就死了,cpu負載會很高的,消耗在你的檢查過時key上了。注意,這裏可不是code

        每隔100ms就遍歷全部的設置過時時間的key,那樣就是一場性能上的災難。實際上redis是每隔100ms隨機抽取一些key來檢查和刪除的。blog

    惰性刪除:在你獲取某個key的時候,redis會檢查一下 ,這個key若是設置了過時時間那麼是否過時了?若是過時了此時就會刪除,不會給你返回任何東西。排序

    並非key到時間就被刪除掉,而是你查詢這個key的時候,redis再懶惰的檢查一下內存

      經過上述兩種手段結合起來,保證過時的key必定會被幹掉。

    可是實際上這仍是有問題的,若是按期刪除漏掉了不少過時key,而後你也沒及時去查,也就沒走惰性刪除,此時會怎麼樣?若是大量過時key堆積在內存裏,致使redis內存塊耗盡了,

        咋整?

內存淘汰機制都有哪些?

    noeviction:當內存不足以容納新數據時,新寫入操做會報錯.這個通常沒人用.

    allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key(無論是否過時)

    allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個key,這個通常沒人用吧,爲啥要隨機,確定是把最近最少使用的key給幹掉啊

    volatile-random:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,隨機移除某個key 

    volatile-ttl:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,有更早過時時間的key優先移除

手寫一下LRU代碼實現?

public class LURCache<K,V> extends LinkedHashMap<K,V> {
    private final int CACHE_SIZEL;
    //這裏就是傳遞進行最多能緩存多少數據
    public LURCache(int cacheSize){
        //這裏就是設置一個hashmap的初始大小,
        // 同時最後一個true指的是讓linkedhashmap按照訪問順序來進行排序,最近訪問的放在頭,最老訪問的放在尾
        super((int)Math.ceil(cacheSize/0.75)+1,0.75f,true);
        CACHE_SIZEL=cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        //這個意思就是說當map中的數據量大於指定的緩存個數的時候,就自動刪除最老的數據.
        return size()>CACHE_SIZEL;
    }
}
相關文章
相關標籤/搜索