首頁  >  文章  >  資料庫  >  Redis刪除策略與逐出策略

Redis刪除策略與逐出策略

咔咔
咔咔原創
2020-05-28 18:29:591461瀏覽

本文知識點

過期資料概念

資料刪除策略

逐出演算法

過期資料


先來看三個key值,分別為sex、name、age。


這三個值設定的指令為set name kaka setex age 100 24 setex sex 10 1


Redis刪除策略與逐出策略

#在redis中我們可以使用ttl來取得某個key的狀態,下面我們來使用ttl分別取得上邊name、age、sex的狀態


可以看到出來了三個值,分別為-1  775   -2

#


那麼這三個值給出的資訊是什麼呢!


  • -1 表示永久有效的資料
  • 775 這個值是設定在age上,使用的指令為setex age 1000 24,表示為剩餘有效時間
  • -2 表示已經過期的數據,或者是被刪除的數據,或者說是麼有定義的數據
    Redis刪除策略與逐出策略


過期資料的儲存結構


  • #當我們設定一個帶有時效性的name時,redis儲存的是一個記憶體位址0x10101
  • 然後redis會再開啟一個空間用來儲存帶有時效性的key
  • 但是儲存方式是key對應的記憶體位址 和過期時間
    Redis刪除策略與逐出策略
    那麼今天我們所說的redis刪除策略,就是刪除的這部分資料。


#

定時刪除


定時刪除就是寫一個定時器,然後當key的時間過期後,定時器任務立即對過期的key進行刪除


優點:可想而知key到期就刪,肯定對記憶體時最友善的,節省記憶體


缺點: redis單線程的特性是所有的指令都在按照一定的順序執行。 key值到期就刪cpu的壓力就會變大,會直接影響到redis伺服器回應時間和IO


定時刪除就是用時間換取空間


當執行完定時刪除後,key值對應的資料會被刪除,同時在過期的記憶體區裡邊也會直接刪除。

Redis刪除策略與逐出策略


惰性刪除


##在來看這個圖當key值過期後不會直接刪除,那是什麼時候刪除呢!繼續往下看

Redis刪除策略與逐出策略


當我們使用惰性刪除時,資料到期了也不會自動刪除,那麼他的刪除方式是,下次在取得這個key值時,會做一個判斷,判斷這個key是否過期,如果過期了在執行刪除。


也就是說當再次執行get name時  會走一個函數expirelfNeeded()  這個函數就是判斷此key是否過期的。過期的返回nil,然後從內部存在進行刪除


Redis刪除策略與逐出策略

#優點:會減少一定的CPU效能,只有到必須要刪的時候才會刪除


缺點:那肯定就是記憶體壓力大了,例如一些熱點新聞,熱點過了就基本上沒人訪問了,沒有人存取這個key就一直存在,就會出現長期佔用一定的記憶體空間


也就說這種方式是用空間換時間


#定期刪除




Redis刪除策略與逐出策略

#在上文中我們提及了兩個種刪除方式,一種是定時刪除,一種是惰性刪除。一個是用空間換時間。一個是用時間換空間。倆種方案都是比較極端的方式。那麼接下來我們就來看看定期刪除的實作方案。


先來看redis的儲存空間,一共有預設為16個,在redis.conf裡邊有一個設定參數database這個參數控制的。每個資料庫都有自己的過期分區,裡邊儲存就是資料位址  和  資料過期時間。


#########實作方式###############redis在啟動時,會取讀取server下的hz的值,預設為10。這個值直接在終端機使用###info server###就可以查看的到#############

Redis刪除策略與逐出策略

然後會每秒鐘執行server下hz次 進行serverCron()輪詢


繼續使用databasesCron對redis的16個函式庫進行挨個存取資訊


#存取時候會再執行activeExpireCycel對每個expires[*]逐一進行偵測,每個執行的時間為250ms / server hz這個參數


在對每個expirs[*]逐一檢測時,會隨機拿出ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC個可以進行檢測



#### ##########如果key逾時,直接刪除key######一輪中刪除的key數量>ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC*25%繼續循環該過程#######如果一輪中刪除的key數量<=ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC###25% ,檢查下一個expires[###]##################那麼現在問題來了,我們的250ms / hz這個時間執行完了,但是把expires的16個資料庫沒有循環完怎麼辦呢! 下次來在循環那個函式庫呢! 其實這個值是有存的,就是current_db這個值。這個值會記錄activeExpireCycel 下次進入那個expires[*]執行###

Redis刪除策略與逐出策略

特點1:CPU使用沒有高峰值,偵測頻率自訂設定


。記憶體壓力不會很大,長時間佔用的記憶體會被持續的清理


#逐出演算法





##在上文中我們說了三種刪除策略,但這三種策略都是相對於設定了有效期限的key才會有效。


那現在我們的redis所使用的記憶體不足了,就會用逐出策略來保證redis的正常使用。

############redis在每次執行指令前會呼叫freeMemorylfNeeded()偵測記憶體是否充足,當不充足時就會清理一些key,這種清除資料的策略稱為逐出策略。 ###############redis最大可使用記憶體的參數為:maxmemory  預設為0   指的是佔用實體記憶體的比例  一般設定50%就可以了####### #####

每次選取待刪除key的個數:maxmemory-samples


#刪除策略:maxmemory-policy


##下面我們來著重說明刪除策略


#偵測易失資料(也就是我們設定了有效期,但還沒到期的數據,就是上文expires[*])
    • volatile-lru:挑選最近少使用的數據
    • volatile-lfu:挑選最近使用次數最少的數據
    • volatile-ttl:挑選將要淘汰的數據
    volatile-random:隨機選擇



######################################################################################################################################### #接下來看一幅圖#############
  • 9s就是現在的時間
  • 距離9s最長的一個key就是age
  • 使用次數最少的就是gender這個key
  • 如果按照volatile- lru就會把age刪除掉
  • 如果依照volatile-lfu就會把gender刪除掉
    Redis刪除策略與逐出策略
  • 偵測全部資料
    • allkeys-lru:挑選最近少使用的資料
    • allkeys-lfu:挑選最近使用次數最少的資料
    • allkeys-random:全庫隨機刪除
  • 放棄資料驅逐
    • #no-enviction  : 資料不會進行任何的刪除,直到記憶體用完,引發oom錯誤。


總結


#以上就是redis對資料的刪除策略和逐出策略。


這裡就一個注意點就是在逐出策略中,易失資料指的是設定了過期時間的key,並非永久性的值。


全庫是指的全部的值,設定了過期時間和永久資料。

以上是Redis刪除策略與逐出策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn