Redis是一種內存級數據庫,數據都存在內存中,但是針對於已經過期的數據,reids不會立刻刪除
只是會存儲在expires中,當執行刪除策略的時候,纔會從expires中尋找對應的數據存儲的地址,在存儲空間中找到對應的數據進行刪除。
數據刪除其實就是內存和CPU佔用之間尋找平衡,CPU才能去處理事情,針對過期數據,要進行刪除的時候,一半有三種策略
1.定時刪除 顧名思義,當key設置有過期時間,時間到了,定時器任務立即執行刪除,相當於消耗CPU來減少內存使用,拿時間換空間。
2.惰性刪除 就是說,數據到達過期時間的時候,先不做處理,等到下次訪問數據的時候,進行訪問,如未過期,返回數據,如過期,則刪除。這就相當於節約了CPU但佔用了內存,拿空間換時間。
3.定期刪除,就是以上兩種的折中,Redis啓動服務器初始化的時候,讀取配置的server.hz的值,這個就是一秒鐘執行的次數
每一秒鐘執行server.hz次 ---->serverCron()----->databaseCron------->acticeExpireCycle() 對每一個expires檢測,隨機挑選W個key進行檢測,如果key已經超時,則刪除,要是這一輪中刪除的key數量超過25%則循環這個過程,如果沒有,則進入下一個expires檢測。
數據淘汰策略
這個是redis內存不足的時,執行的,redis執行命令之前,都會用freeMemoryIfNeeded()方法,檢測這次內存是否充足,如果不滿足加入新數據,則會執行淘汰策略(淘汰未過期的數據)
檢測易失去數據(一般是有定時,會過期的數據的)
volatile-lru:挑選最近最少使用的數據淘汰
volatile-lfu:挑選最近使用次數最少的數據淘汰
volatile-ttl:挑選將要過期的數據淘汰
volatile-random:任意選擇數據淘汰
全庫數據
allkeys-lru:挑選最近最少使用的數據淘汰 allkeLyRs-lfu::挑選最近使用次數最少的數據淘汰 allkeys-random:任意選擇數據淘汰,相當於隨機