redis的key過期了還存在嗎

最近我們在redis集群中發(fā)現(xiàn)了一個有趣的問題。在花費大量時間進(jìn)行調(diào)試和測試后,通過更改key過期,我們可以將某些集群中的redis內(nèi)存使用量減少25%。

redis的key過期了還存在嗎

Twitter內(nèi)部運(yùn)行著多個緩存服務(wù)。其中一個是由Redis實現(xiàn)的。我們的Redis集群中存儲了一些Twitter重要的用例數(shù)據(jù),例如展示和參與度數(shù)據(jù)、廣告支出計數(shù)和直接消息。

問題背景 ? ? ? ? ? ? ? (推薦學(xué)習(xí):Redis視頻教程

早在2016年初,Twitter的Cache團(tuán)隊就對Redis集群的架構(gòu)進(jìn)行了大量更新。Redis發(fā)生了一些變化,其中包括從Redis 2.4版到3.2版的更新。

在此更新后,出現(xiàn)了幾個問題,例如用戶開始看到內(nèi)存使用與他們的預(yù)期或準(zhǔn)備使用的內(nèi)存不一致、延遲增加和key清除問題。key的清除是一個很大的問題,這可能導(dǎo)致本應(yīng)持久化的數(shù)據(jù)可能被刪除了,或者請求發(fā)送到數(shù)據(jù)原始存儲。

初步調(diào)查

受影響的團(tuán)隊和緩存團(tuán)隊開始進(jìn)行初步的調(diào)查。我們發(fā)現(xiàn)延遲增加與現(xiàn)在正在發(fā)生的key清除有關(guān)。當(dāng)Redis收到寫入請求但沒有內(nèi)存來保存寫入時,它將停止正在執(zhí)行的操作,清除key然后保存新key。

但是,我們?nèi)匀恍枰页鰧?dǎo)致這些新清除的內(nèi)存使用量增加的原因。

我們懷疑內(nèi)存中充滿了過期但尚未刪除的key。有人建議使用掃描,掃描的方法會讀取所有的key,并且讓過期的key被刪除。

在Redis中,key有兩種過期方式,主動過期和被動過期。掃描將觸發(fā)key的被動過期,當(dāng)讀取key時, TTL將會被檢查,如果TTL已過期,TTL會被刪除并且不返回任何內(nèi)容。

Redis文檔中描述了版本3.2中的key的主動過期。key的主動過期以一個名為activeExpireCycle的函數(shù)開始。它以每秒運(yùn)行幾次的頻率,運(yùn)行在一個稱為cron的內(nèi)部計時器上。

activeExpireCycle函數(shù)的作用是遍歷每個密鑰空間,檢查具有TTL集的隨機(jī)kry,如果滿足過期kry的百分比閾值,則重復(fù)此過程直到滿足時間限制。

這種掃描所有kry的方法是有效的,當(dāng)掃描完成時,內(nèi)存使用量也下降了。似乎Redis不再有效地使key過期了。

但是,當(dāng)時的解決方案是增加集群的大小和更多的硬件,這樣key就會分布得更多,就會有更多的可用內(nèi)存。這是令人失望的,因為前面提到的升級Redis的項目通過提高集群的效率降低了運(yùn)行這些集群的規(guī)模和成本。

更多Redis相關(guān)技術(shù)文章,請訪問Redis視頻教程欄目進(jìn)行學(xué)習(xí)!

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊11 分享