最近我們在Redis叢集中發現了一個有趣的問題。在花費大量時間進行偵錯和測試後,透過更改key過期,我們可以將某些叢集中的Redis記憶體使用量減少25%。
Twitter內部運行多個快取服務。其中一個是由Redis實現的。我們的Redis叢集中儲存了一些Twitter重要的用例數據,例如展示和參與度數據、廣告支出計數和直接訊息。
問題背景 (建議學習:Redis視訊教學)
早在2016年初,Twitter的Cache團隊就對Redis叢集的架構進行了大量更新。 Redis發生了一些變化,其中包括從Redis 2.4版到3.2版的更新。
在此更新後,出現了幾個問題,例如用戶開始看到記憶體使用與他們的預期或準備使用的記憶體不一致、延遲增加和key清除問題。 key的清除是一個很大的問題,這可能導致本應持久化的資料可能被刪除了,或者請求發送到資料原始儲存。
初步調查
受影響的團隊和快取團隊開始進行初步的調查。我們發現延遲增加與現在正在發生的key清除有關。當Redis收到寫入請求但沒有記憶體來保存寫入時,它將停止正在執行的操作,清除key然後儲存新key。
但是,我們仍然需要找出導致這些新清除的記憶體使用量增加的原因。
我們懷疑記憶體充滿了過期但尚未刪除的key。有人建議使用掃描,掃描的方法會讀取所有的key,並且讓過期的key被刪除。
在Redis中,key有兩種過期方式,主動過期和被動過期。掃描將觸發key的被動過期,當讀取key時, TTL將會被檢查,如果TTL已過期,TTL會被刪除並且不傳回任何內容。
Redis文件中描述了版本3.2中的key的主動過期。 key的主動過期以一個名為activeExpireCycle的函數開始。它以每秒運行幾次的頻率,運行在一個稱為cron的內部計時器上。
activeExpireCycle函數的作用是遍歷每個金鑰空間,檢查具有TTL集的隨機kry,如果滿足過期kry的百分比閾值,則重複此過程直到滿足時間限制。
這種掃描所有kry的方法是有效的,當掃描完成時,記憶體使用量也下降了。似乎Redis不再有效地使key過期了。
但是,當時的解決方案是增加叢集的大小和更多的硬件,這樣key就會分佈得更多,就會有更多的可用記憶體。這是令人失望的,因為前面提到的升級Redis的專案透過提高叢集的效率降低了運行這些叢集的規模和成本。
更多Redis相關技術文章,請造訪Redis資料庫使用入門教學欄位學習!
以上是redis的key過期了還存在嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!