Redis基礎系列(八)——過時鍵刪除策略

這是我參與更文挑戰的第26天,活動詳情查看:更文挑戰數據庫

Redis 設置鍵過時時間的命令

/** * 將key 的值設置爲 value,並將 key 的過時時間設爲 seconds (以秒爲單位)。 * 只適用於String對象 */
SETEX key seconds value 

/** * 這個命令和 SETEX 命令類似,但它以毫秒爲單位設置 key 的生存時間, * 而不是像 SETEX 命令那樣,以秒爲單位。 * 只適用於String對象 */
PSETEX key milliseconds value

//將鍵 key 的生存時間設置爲 seconds 秒
EXPIRE key seconds    
    
//將鍵 key 的生存時間設置爲 milliseconds 毫秒
PEXPIRE key milliseconds 
    
//將鍵 key 的過時時間設定爲 timestemp 指定的秒數時間戳
EXPIREAT key timestemp 
    
//將鍵 key 的過時時間設定爲 milliseconds-timestemp 指定的秒數時間戳
PEXPIREPAT key milliseconds-timestemp 
複製代碼

  以上六種設置鍵過時的方式,其中 SETEXPSETEX兩個命令只適用於字符串對象,其餘4個命令適用於全部鍵類型。雖然有不少不一樣的命令能夠設置鍵過時,可是最終其餘的命令都會被轉爲經過 PEXPIREPAT 命令實現。服務器

過時鍵刪除策略

  經過設置鍵的過時時間,能夠判斷某個時間點一個鍵是否過時。對於已過時的鍵,還須要將其刪除,刪除的策略有三種:markdown

  • 定時刪除:在設置鍵的過時時間時,建立一個定時器,讓定時器在鍵過時的時候,當即執行對鍵的刪除操做。
    • 優勢:對內存最友好,應刪盡刪
    • 缺點:對CPU不友好,在過時鍵較多的狀況下,定時器會佔用太多的CPU資源
  • 惰性刪除:聽任過時鍵無論,每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過時,若是過時則將其刪除並返回nil,若是鍵不過時則返回鍵。
    • 優勢:對CPU友好,只在用到鍵的時候才判斷是否過時
    • 缺點:對內存不友好,若是一個過時鍵沒有再被用到,也就會一直留在內存中
  • 按期刪除:每隔一段時間,程序就對數據庫進行一次檢查,刪除裏面的過時鍵。
    • 對定時刪除和按期刪除進行整合和折中,同時減輕CPU和內存的消耗
    • 難點:如何肯定刪除操做執行的時長和頻率,執行得太頻繁或者執行時間太長會退化爲定時刪除,執行得太少則退化爲惰性刪除

Redis 過時鍵刪除策略

  Redis 中採用惰性刪除和按期刪除配合的策略,實現合理使用CPU時間和避免浪費內存空間之間取得平衡。函數

Redis 中,對於設置了過時時間的鍵,每次讀寫鍵時都會調用expireNeeded函數判斷鍵是否過時。post

惰性刪除策略模式以下:spa

惰性刪除策略.png

按期刪除策略code

  • 每隔一段時間,Redis會用規定的時間片斷,從指定數據庫中取出必定數量的鍵進行檢查是否過時
  • 使用 current_db 記錄當前的檢查的數據庫(一個Redis服務器中能夠有多個數據庫,經過 select 命令指定當前使用的數據庫)
  • 當全部數據庫都被檢查一遍以後,current_db 被設置爲0,下一次從0號數據庫開始從新檢查
相關文章
相關標籤/搜索