❝本文知識點 過期資料概念 資料刪除策略 逐出演算法
❞
❝
這三個值設定的指令為set name kaka setex age 100 24 setex sex 10 1
在redis中我們可以使用ttl來取得某個key的狀態,下面我們來使用ttl
分別取得上邊name、age、sex的狀態
可以看到出來了三個值,分別為-1 775 -2
那麼這三個值給的資訊是什麼呢!
setex age 1000 24
,表示為剩餘有效時間#定時刪除就是寫一個定時器,然後當key的時間過期後,定時器任務立即刪除過期的key
#優點:可想而知key到期就刪,肯定對記憶體時最友善的,節省記憶體
缺點: redis單線程的特性是所有的指令都在按照一定的順序執行。 key值到期就刪cpu的壓力就會變大,會直接影響到redis伺服器回應時間和IO
定時刪除就是用時間來換取空間
當執行完定時刪除後,key值對應的資料會被刪除,同時在過期的記憶體區裡邊也會直接刪除。
#在來看這個圖當key值過期後不會直接刪除,那是什麼時候刪除呢!繼續往下看
當我們使用惰性刪除時,資料到期了也不會自動刪除,那麼他的刪除方式是,在下次在取得這個key值時,會做一個判斷,判斷這個key是否過期,如果過期了在執行刪除。
也就是說當再次執行get name時 會走一個函數expirelfNeeded()
這個函數就是判斷此key是否過期的。過期的返回nil,然後從內存在刪除
#優點:會減少一定的CPU效能,只有到必須刪除的時候才會刪除
#缺點:那肯定就是記憶體壓力大了,例如一些熱點新聞,熱點過了就基本沒人訪問了,沒有人訪問這個key就一直存在,就會出現長期佔用一定的內存空間
也就說這種方式是用空間換時間
#在上文中我們提及了兩個兩種刪除方式,一種是定時刪除,一種是惰性刪除。一個是用空間換時間。一個是用時間換空間。倆種方案都是比較極端的方式。那麼接下來我們就來看看定期刪除的實作方案。
先來看看redis的儲存空間,一共有預設為16個,在redis.conf裡邊有一個設定參數database這個參數控制的。每個資料庫都有自己的過期分區,裡邊儲存就是資料位址 和 資料過期時間。
實作方式
redis在啟動時,會取讀取server下的hz的值,預設為10。這個值直接在終端機上使用info server
就可以查看的到
然後會每秒鐘執行server下hz次 進行serverCron()輪詢
繼續使用databasesCron對redis的16個函式庫進行挨個存取資訊
存取時候會再執行activeExpireCycel對每個expires[*]逐一進行偵測,每個執行的時間為250ms / server hz這個參數
在每個expirs[*]逐一檢測時,會隨機拿出ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC個可以進行檢測
特點1:CPU使用沒有高峰值,偵測頻率自訂設定
特點2:記憶體壓力不會很大, 長時間佔用的記憶體會被持續的清理那現在我們的redis使用的記憶體不足了,就會用逐出策略來保證redis的正常使用。
redis在每次執行指令前會呼叫freeMemorylfNeeded()來偵測記憶體是否充足,當不充足時就會清理一些key,這種清除資料的策略稱為逐出策略。
redis最大可用記憶體的參數為:maxmemory 預設為0 指的是佔用實體記憶體的比例 一般設定50%就可以了
每次選取待刪除key的個數: maxmemory-samples
刪除策略:maxmemory-policy
#「下面我們來著重說明刪除策略」
接下來看一幅圖
9s是現在的時間
距離9s最長的一個key就是age
#
檢測全部資料
放棄資料驅逐
以上就是redis對資料的刪除策略和逐出策略。
這裡就一個注意點就是在逐出策略中,易失資料指的是設定了過期時間的key,並非永久性的值。
全庫是指的全部的值,設定了過期時間和永久資料。
❝堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。希望在偌大互聯網中咔咔的文章能帶給你一絲絲幫助。我們下期再見。
❞
#推薦:《redis教學》
以上是Redis刪除策略與逐出策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!