一、Redis緩存過期策略
物理內存達到上限后,像磁盤空間申請虛擬內存(硬盤與內存的swap),甚至崩潰。
內存與硬盤交換 (swap) 虛擬內存,頻繁I0 性能急劇下降,會造成redis內存急劇下降;?
一般設置物理內存的3/4,在redis.conf中
maxmemory 1024mb
?二、過期時間
? ? ? ? 2.1 數據結構原理
聲明數據expires來存儲過期時間,redis使用c語言開發,dict是字典,存儲key-value結構,類似于map
1、dict 用來維護一個Redis 數據庫中包含的所有 Key-Value 鍵值對。
2、expires則用于維護一個 Redis 數據庫中設置了失效時間的鍵(即key與失效時間的映射)。
3、執行過程:當我們使用 expire命令設置一個key的失效時間時,Redis 首先到dict這個字典表中查找要設置的key是否存在,如果存在就將這個key和失效時間添加到expires這個字典表
當我們使用 setex命令向系統插入數據時,Redis 首先將 Key 和 Value 添加到dict這個字典表中,然后將Key和失效時間添加到expires這個字典表中。
4、設置了失效時間的key和具體的失效時間全部都維護在expires這個字典表中。
2.2 設置超時時間
設置超時時間:
set name:2 111 PX 3000
三、過期key的刪除策略
3.1 惰性刪除
????????在key被訪問時如果發現它已經失效,那么就刪除它,調用expirelfNeeded函數,該函數的意義是: 讀取數據之前先檢查一下它有沒有失效,如果失效了就刪除它。
?
?3.2 主動刪除
3.2.1 刪除策略介紹
?觸發時機:當內存超過maxmemory限定時,觸發主動清理策略,該策略由啟動參數的配置決定。
? 策略種類:主動刪除策略LRU,LFU,random,ttl,noenviction。
????????在redis.conf文件中可以配置主動刪除策略,默認是no-enviction (不刪除)
maxmemory-policy alTkeys-Tru
3.2.2 LRU
????????LRU(Least recently used)最近最少使用(類似java的linkedHashMap),刪除不經常被訪問的數據。最常見的實現是使用一個鏈表保存緩存數據,詳細算法實現如下:
1.新數據插入到鏈表頭部;
2.每當緩存命中 (即緩存數據被訪問) ,則將數據移到鏈表頭部
3.當鏈表滿的時候,將鏈表尾部的數據丟棄。?
3.2.3 LFU
從已設置過期時間的數據集挑選使用頻率最低的數據淘汰。
3.2.4 ttl
從已設置過期時間的數據集中挑選將要過期的數據淘汰。
3.2.5 volatile-random
從已設置過期時間的數據集中任意選擇數據淘汰。
3.2.6?noenviction
Redis 的默認策略。在內存超過閥值后,Redis 不做任何清理工作,然后對所有寫操作返回錯誤,但對讀請求正常處理。
3.2.7 可參考連接
面試官,請不要再問我 Redis 的淘汰策略了!_楊同學technotes的博客-CSDN博客