?往期內容:
大廠面試官問我:Redis處理點贊,如果瞬時涌入大量用戶點贊(千萬級),應當如何進行處理?【后端八股文一:Redis點贊八股文合集】-CSDN博客
大廠面試官問我:布隆過濾器有不能擴容和刪除的缺陷,有沒有可以替代的數據結構呢?【后端八股文二:布隆過濾器八股文合集】-CSDN博客
大廠面試官問我:Redis持久化RDB有沒有可能阻塞?阻塞點在哪里?【后端八股文三:Redis持久化八股文合集】-CSDN博客
本文為【Redis內存淘汰策略八股文合集】初版,后續還會進行優化更新,歡迎大家關注點贊評論交流~
大家第一眼看到這個標題,不知道心中是否有答案了?在面試當中,面試官經常對項目亮點進行深挖,來考察你對這個項目亮點的理解以及思考!這個時候,你如果可以回答出面試官的問題,甚至是主動說出自己的思考,那在面試中是大大加分的~
內存淘汰策略
(新寫報錯,最近最少使用,隨機,過期最近最少使用,過期隨機,過期更早)
指的是Redis的用于緩存的內存不足時,怎么處理需要新寫入且需要申請額外空間的數據
noeviction:新寫入報錯
allkeys-lru:在鍵空間中,移除最近最少使用的 key。
allkeys-random:在鍵空間中,隨機移除某個key。
volatile-lru:在設置了過期時間的鍵空間中,移除最近最少使用的 key。
volatile-random:在設置了過期時間的鍵空間中,隨機移除某個 key。
volatile-ttl:在設置了過期時間的鍵空間中,有更早過期時間的 key 優先移除。
Redis數據淘汰策略,最常用的是哪個?默認是哪個?
Redis中最常用的淘汰策略是LRU(Least Recently Used)。這也是Redis的默認淘汰策略。
有了刪除策略為什么還需要有淘汰策略
因為刪除策略的惰性策略是用到才比較是否過期,而定時策略是選一批執行刪除。所以還有很多的數據是被漏掉的。
/
刪除策略和淘汰策略都是為了解決Redis數據超出內存限制的問題。刪除策略是在訪問數據時才進行過期檢查,比較被動。而淘汰策略是主動選擇要淘汰的數據,更加主動和有計劃。
Redis單線程怎么去淘汰Key的呢?
- Redis雖然是單線程的,但是它會定期(每100ms)主動掃描一批Key,檢查是否過期。
- 對于過期的Key,Redis會立即將其刪除。
- 同時,在執行其他命令時,如果遇到過期的Key,也會立即將其刪除。
- 這樣可以保證過期數據能夠及時被清理。
Redis的超時淘汰了解過嗎,數據結構是怎么實現的?
- Redis使用一個過期字典(expire dictionary)來存儲每個Key的過期時間戳。
- 當訪問一個Key時,會檢查其是否過期,如果過期則立即刪除。
- 同時Redis會定期(每100ms)對過期字典進行掃描,刪除已經過期的Key。
- 這個過期字典采用惰性刪除的方式,即在訪問時檢查過期,減輕了Redis的CPU負擔。
Redis中的內存淘汰策略中volatile-lru和allkeys-lru有什么區別?
- volatile-lru: 在設置了過期時間的key中,淘汰最近最少使用的key。
- allkeys-lru: 在所有的key中,淘汰最近最少使用的key。
場景題:使用Redis淘汰策略為什么要給熱門視頻設置遞增的TTL,有沒有考慮過熱門視頻變的不那么熱門了,但是零星有幾個用戶訪問,此時該視頻的生存時間又很長,很難被Redis淘汰,這個問題如何解決?
對于熱門視頻設置遞增的TTL確實能讓它們在一定時間內不被淘汰。但當熱度下降后,這些視頻可能會一直存在,難以被淘汰。可以考慮結合LRU策略,在過期前一段時間內將視頻的TTL重置,或者使用volatile-lru策略來淘汰它們。
Redis如何設計LRU? / Redis內存淘汰, LRU維護整個隊列嗎?
- Redis使用一個雙向鏈表來維護LRU隊列。每個Key都對應一個節點,節點包含該Key的訪問時間戳。
- 當訪問一個Key時,會將其移動到鏈表頭部,表示最近訪問。
- 當需要淘汰時,會從鏈表尾部(最久未訪問)刪除節點對應的Key。
- 這樣可以在O(1)時間內完成Key的訪問和淘汰操作。
Redis如何設計LFU?
- Redis使用一個字典來維護每個Key的訪問頻率Counter。
- 當訪問一個Key時,會增加其Counter值。
- 當需要淘汰時,會從Counter值最小的Key開始淘汰。
- 為了防止Counter無限增大,Redis會定期對所有Key的Counter進行衰減。
Redis為什么要使用LRU作為淘汰方式,不使用LFU呢?
(底層實現簡單)
Redis使用LRU而不是LFU主要是因為LRU更簡單高效,而且能較好地反映用戶的訪問模式。LFU需要維護一個頻率統計,計算復雜度高,適合于某些特殊場景。
Redis怎么配置內存淘汰策略?
比如:配置文件中的maxmemory-policy的鍵中選
maxmemory-policy allkeys-lru
??---------------------------------------------------------------------------------------------------------------
后期新的八股文合集文章會僅粉絲可見,感興趣的小伙伴可以點個關注~
?更多精彩內容以及一手消息請關注公眾號:絕命Coding
公眾號私信回復“免費資料”可免費獲取簡歷模板以及技術亮點合集等免費資料