接下來介紹Redis里的過期機制。Redis作為內(nèi)存數(shù)據(jù)庫,和普通的關(guān)系型數(shù)據(jù)庫相比,優(yōu)勢在于快,劣勢是持久化稍差。實際上很多內(nèi)存數(shù)據(jù)庫都是來存一些時效性數(shù)據(jù),比如限時優(yōu)惠活動,緩存或者驗證碼可以采用Redis過期機制進行管理。這個時候千萬不要忘記設(shè)立過期時間,若不設(shè),只能等內(nèi)存滿了,一個個查看Key有沒有使用。

在Redis里設(shè)過期數(shù)據(jù)很簡單,直接用expire命令即可。在Key過期的時候,Redis會自動把這個Key刪除。“自動”是指有一個觸發(fā)時機,很容易想到用定時器。Redis為了不影響正常的讀寫操作,一般只會在必要或CPU空閑的時候做過期清理的動作;必要的時候即訪問Key的時候,CPU空閑的時候具體分為兩個,一是一次事件循環(huán)結(jié)束,進入事件偵聽前,二是系統(tǒng)空閑時做后臺定期任務(wù)。且第二個是有時間限制的。時間限制為25%的CPU時間。

Redis后臺清理任務(wù)默認1秒鐘執(zhí)行10次,也就是100ms。相當于若沒有其他操作,全都用來做后臺任務(wù),后臺任務(wù)如果把CPU占滿的話,一次可以執(zhí)行100ms。25%的限制表示,后臺任務(wù)里面,100ms里有25ms可以做過期Key清理,還有一些其他Redis管理方面的任務(wù)要做。

過期Key清理算法比較簡單。首先,依次遍歷所有db;然后,從db中隨機取20個Key,判斷是否過期,若過期,則逐出;若有5個以上Key過期,則重復上述步驟,否則遍歷下一個db;在清理過程中,若達到了時間限制,超過了25ms,則退出清理過程。
總結(jié)一下算法的特點:
1? 這是一個基于概率的簡單算法,假設(shè)抽出的樣本能夠代表整個Key空間(如果運氣不好,有20個Key沒過期,剛好取到這20個。算法基礎(chǔ)為在CPU允許的時間內(nèi)一直清理,一直清理到過期Key占整個db中Key的25%以下)。
2? 單次運行時間有25% CPU時間的限制。
3? Redis持續(xù)清理過期的數(shù)據(jù),直至將要過期的Key的百分比降到了25%以下。
4? 長期來看,任何給定的時刻已經(jīng)過期但仍占據(jù)著內(nèi)存空間的Key的量,最多為每秒的寫操作量除以4。因為Redis最大的特色就是高效,所以會犧牲一些無關(guān)緊要的部分。
那么在實際中怎樣更好地發(fā)揮Key呢?首先,淘汰過程以Key為單位,如果有大Key存在,有可能刪除耗時太長,從而導致長時間服務(wù)不可用。其次,可以調(diào)高HZ參數(shù),從而可以提升淘汰過期Key的頻率,即刪除的更加及時;相應(yīng)的,每次淘汰最大時間限制將減少,可使系統(tǒng)響應(yīng)時間變快;在一般情況下并不能降低過期Key所占比率;另外,會導致空閑時CPU占用率提高。不過,一般情況下可用默認值,不需要調(diào)整。
原地址:https://mp.weixin.qq.com/s/n4HXKXPKf87qgZ_e6s4gPg