1、Redis設置鍵的生存時間或者過期時間
生存時間:指當前鍵可以保持多長時間;
過期時間:指當前鍵什麼時候過期,具體的時間戳;
設置過期時間一般用expire,或者pexpire,主要區別:expire單位是秒,而pexpire單位是毫秒。
TTL、PTTL命令,返回當前鍵距離過期還有多長時間,TTL單位是秒,PTTL單位是毫秒。
Redis有四個不同的命令可以用於設置鍵的生存時間或過期時間:
- EXPIRE<key><ttl> (單位:秒)
- PEXPIRE<key><ttl> (單位:毫秒)
- EXPIREAT<key><timestamp>(UNIX時間戳)
- PEXPIREAT<key><timestamp>(UNIX時間戳)
其實不管使用EXPIRE、PEXPIRE還是EXPIREAT,最終都是通過PEXPIREAT去設置過期時間,redis專門用過期字典,來保存所有鍵的過期時間,過期字典保存了對應鍵的過期時間戳,判斷鍵是否過期,就是當前時間戳跟過期字典裏面保存的時間戳進行比較。
2、Redis刪除過期鍵的3種策略
1、定時刪除:設置鍵的過期時間的同時,創建一個定時器,然後在鍵過期的時候自動觸發刪除操作。
2、惰性刪除:就是在獲取鍵的時候,檢查鍵是否過期,如果過期的話,執行刪除操作。
3、定期刪除:每隔一段時間,檢查數據庫中的鍵是否過期,如果過期的話,執行刪除操作。
3、3種策略的優缺點
1、定時刪除:有利於內存,可以儘可能的釋放和利用,因爲在鍵過期的時候觸發刪除操作,但是如果同一個時刻過期鍵非常多,這時候會佔用系統CPU很長一段時間,就會影響其它服務的吞吐量以及響應時間,導致大量請求超時;除此之外,創建一個定時器需要用到Redis服務器中的時間事件,因爲時間事件底層是通過無序鏈表實現的,Redis並不能高效的處理大量時間事件,所以通過大量時間事件處理過期鍵並不合適。
2、惰性刪除:跟定時刪除切切相反,有利於CPU,不利於Redis內存,因爲獲取鍵的時候(所有讀寫數據庫的命令都會觸發,比如GET,EXPIRE、TTL、PTTL等),如果鍵過期了,纔會執行刪除操作,這樣基本不佔用CPU,但是如果數據庫有很多鍵無人問津,內存就越來越少,除非清空所有鍵!!!
3、定期刪除:每隔一段時間執行一次刪除過期鍵操作(默認間隔時間:100ms,間隔時間需要根據服務器性能以及相關業務綜合評估來設定),並通過限制刪除操作執行的時長和頻率來減少刪除操作對CPU時間的影響,同時解決了過期鍵佔用內存的問題。