Redis是一種內存級數據庫,全部數據均存放在內存中,內存中的數據能夠經過TTL指令來獲取其狀態,當 key 不存在時,返回 -2 。 當 key 存在但沒有設置剩餘生存時間時,返回 -1 。 不然,以秒爲單位,返回 key 的剩餘生存時間。redis
目標:在內存佔用與CPU佔用之間尋找一種平衡,顧此失彼都會形成redis性能的總體降低,甚至引起服務器宕機或內存泄漏。算法
定時刪除數據庫
建立一個定時器,當key設置有過時時間,且過時時間到達時,由定時器任務當即執行對鍵的刪除操做服務器
優勢:節約內存,到時就刪除,快速釋放掉沒必要要的內存佔用性能
缺點:CPU壓力很大,不管CPU此時負載多高,均佔用CPU,會影響redis服務器響應時間和指令吞吐量blog
總結:用處理器性能換取存儲空間內存
惰性刪除配置
數據到達過時時間,不作處理。等下次訪問該數據時發現以過時,刪除,返回不存在內存泄漏
優勢:節約CPU性能,發現必須刪除的時候才刪除定時器
缺點:內存壓力很大,出現長期佔用內存數據
總結:用存儲空間換取處理器性能
按期刪除
週期性輪詢redis庫中的時效型數據,採用隨機抽取的策略,利用過時數據佔比的方式控制刪除頻度
特色:CPU性能佔用設置有峯值,檢測頻度可自定義設置。內存壓力不是很大,長期佔用內存的數據會被持續清理。
當新數據進入redis時,若是內存不足怎麼辦?
Redis使用內存存儲數據,在執行每個命令前,會調用freeMemoryIfNeeded()檢測內存是否充足。若是內存不知足新加入數據的最低存儲要求,redis要臨時刪除一些數據爲當前指令清理清理存儲空間。清理數據的策略稱爲逐出算法。
注意:逐出數據的過程不是100%可以清理出足夠的可以使用的內存空間,若是不成功則反覆執行。當對全部數據嘗試完畢後,若是不能達到內存清理的要求,將報OOM錯誤。
影響數據逐出的相關配置