前言
小鹹兒的項目中使用redis來做緩存,從而減輕數據庫的壓力,但是redis中的key和數據過期後,爲什麼內存空間還沒有釋放呢?如果內存空間將要滿的時候該怎麼辦呢?接下來小鹹兒就來解釋一下該如何解決這兩個問題。
過期策略:定期刪除+惰性刪除
redis中的key和數據過期後,爲什麼內存空間還沒有釋放呢?
既然提到redis的過期策略,那麼該如何解決這個問題就有點苗頭了。先來一張統領全局的圖
定期刪除
redis默認每隔100ms就隨機抽取一些設置了過期時間的key,檢查其是否過期,如果過期就刪除。
問題:因爲是隨機抽取,定期刪除可能導致很多過期key到了時間並沒有被刪除掉,這時候該怎麼辦呢?惰性刪除該上場了。
惰性刪除
在你獲取某個key時,redis會檢查一下,是否設置了過期時間?設置了過期時間是否過期了?如果過期了就刪除,不會給你返回任何東西。
問題:實際上,這仍然有問題:比如定期刪除漏掉了很多過期key,然後也沒及時查詢,也就沒走惰性刪除,這時就會有大量過期的key堆積在內存中,導致redis內存快耗盡了,怎麼辦?
如果內存空間將要滿的時候該怎麼辦呢?
出現這種情況,就應該淘汰策略上場了,淘汰策略從設置過期時間中的key和從所有的key方面分爲兩類。
設置過期時間的key中
▪ volatile-lru:設置了過期時間的鍵空間中,移除最近最少未使用的key。
▪ volatile-ttl:設置了過期時間的鍵空間中,移除即將過期的key。
▪ volatile-random:設置了過期時間的鍵空間中,隨機移除某個key
所有的key中
▪ noeviction:永不過期,不淘汰,寫入新數據時,會報錯。
▪ 鍵空間中,移除最近最少未使用的key。
▪ allkeys-random:鍵空間中,隨機移除某個key
黑色背景 |
小結
有關redis的內容,不僅要知其然還有知其所以然。
感謝您的閱讀~~