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