
### 本系列帖子為鼠鼠復習八股鞏固記憶和個人理解所寫如有錯誤純屬本人實力不佳歡迎各位大佬閱讀指正 ###1.Redis 鍵過期刪除三種策定時刪除key設置過期時間時創建一個定時器時間一到立即刪除。優點內存友好過期key馬上被刪不會浪費內存。缺點cpu不友好大量key同時過期會產生大量定時器事件阻塞主線程影響Redis性能。惰性刪除不主動刪等key被訪問時先檢查是否過期過期就刪除并返回不存在。優點cpu友好只有在用到時才處理不占用額外cpu.缺點內存不友好大量長期不訪問的過期key會一致占內存浪費內存。定期刪除Redis每隔一段時間隨機抽取一部分key檢查刪除其中過期的。優點平衡CPU和內存不會占用太多CPU也能及時清理過期key。缺點隨機抽取有執行時間限制不能保證所有過期key都被及時刪掉。2.Redis 內存滿后八大淘汰策略分別是什么Redis內存使用達到上限之后一共有八種內存淘汰機制可分成三類不淘汰數據noeviction默認策略內存滿了之后直接拒絕寫入并返回錯誤保證數據不丟失。設置了過期時間的keyvolatile-lru淘汰最近最少使用的過期key。volatile-lfu淘汰使用頻率最低的過期key。volatile-random隨機淘汰過期key。volatile-ttl淘汰剩余存活時間最短、馬上要過期的key。針對所有keyallkeys-lru在全部key里淘汰最近最少使用的。allkeys-lfu在全部key里淘汰使用頻率最低。allkeys-random隨機淘汰任意key。3.LRU 底層實現原理、Redis 近似 LRU 怎么做的傳統LRU是最近最少使用淘汰算法核心是如果最近被訪問過那么將來被訪問的概率也更高主要實現是哈希表雙向鏈表。為什么Redis不用標準LRU標準LRU需要額外鏈表結構占用內存大且高并發下頻繁移動節點會有性能開銷Redis用的是近似LRU。近似LRU原理每個key自帶一個24bit的時間戳記錄最后一次被訪問的時間內存不足淘汰時隨機采用5個key從中選出lru時間最早的key淘汰重復執行直到內存降到閾值一下。優點幾乎不額外占用內存。效率極高避免鏈表維護開銷。采樣數足夠時效果接近標準LRU。4.過期鍵會不會主動占用內存主從間過期怎么同步會并且在被真正刪除前一直占用內存。redis只是給key打上過期標記并不會立即釋放內存只有當key觸發懶性刪除、后臺定時任務執行定期刪除時才會真正把過期key從內存刪除如果大量過期key長期不被訪問就會持續占用內存。主從間過期如何同步主節點主導刪除從節點不主動刪。主庫在自身觸發惰性刪除或定期刪除后會將對應DEL命令同步到從庫從庫只負責執行這條命令從而實現過期鍵的同步刪除。Redis 3.2之后從庫讀取時如果發現key已經過期會直接返回空假裝key不存在但不會執行物理刪除避免主從刪除時序不一致保證最終數據一致。