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