如何解決redis中過期問題?(第一章)

2021-09-23 23:45:58 字數 1704 閱讀 2879

最近我們在redis集群中發現了乙個有趣的問題。在花費大量時間進行除錯和測試後,通過更改key過期,我們可以將某些集群中的redis記憶體使用量減少25%。

twitter內部執行著多個快取服務。其中乙個是由redis實現的。我們的redis集群中儲存了一些twitter重要的用例資料,例如展示和參與度資料、廣告支出計數和直接訊息。

1、問題背景

早在2023年初,twitter的cache團隊就對redis集群的架構進行了大量更新。redis發生了一些變化,其中包括從redis 2.4版到3.2版的更新。在此更新後,出現了幾個問題,例如使用者開始看到記憶體使用與他們的預期或準備使用的記憶體不一致、延遲增加和key清除問題。key的清除是乙個很大的問題,這可能導致本應持久化的資料可能被刪除了,或者請求傳送到資料原始儲存。

2、初步調查

受影響的團隊和快取團隊開始進行初步的調查。我們發現延遲增加與現在正在發生的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的專案通過提高集群的效率降低了執行這些集群的規模和成本。

3、redis版本:有什麼改變?

redis版本2.4和3.2之間,activeexpirecycle的實現發生了變化。在redis 2.4中,每次執行時都會檢查每個資料庫,在redis3.2中,可以檢查的資料庫數量達到了最大值。版本3.2還引入了檢查資料庫的快速選項。「slow」在計時器上執行,「fast」 執行在檢查事件迴圈上的事件之前。快速到期週期將在某些條件下提前返回,並且它還具有較低的超時和退出功能閾值。時間限制也會被更頻繁地檢查。總共有100行**被新增到此函式中。

4、進一步調查

最近我們有時間回過頭來重新審視這個記憶體使用問題。我們想探索為什麼會出現regression,然後看看我們如何才能更好地實現key expiration。我們的第乙個想法是,在redis中有很多的key,只取樣20是遠遠不夠的。我們想研究的另一件事是redi 3.2中引入資料庫限制的影響。

縮放和處理shard的方式使得在twitter上執行redis是獨一無二的。我們有包含數百萬個key的key空間。這對於redis使用者來說並不常見。shard由key空間表示,因此redis的每個例項都可以有多個shard。我們redis的例項有很多key空間。sharding與twitter的規模相結合,建立了具有大量key和資料庫的密集後端。

如何解決Redis中的key過期問題

最近我們在redis集群中發現了乙個有趣的問題。在花費大量時間進行除錯和測試後,通過更改key過期,我們可以將某些集群中的redis記憶體使用量減少25 twitter內部執行著多個快取服務。其中乙個是由redis實現的。我們的redis集群中儲存了一些twitter重要的用例資料,例如展示和參與度...

如何解決PL SQL Developer過期的情況

原文出自度娘 在此我僅作為記錄,以便自己檢視 這種方法只能用30天,所以緊急事情解決後,還是趕緊找註冊碼吧,一勞永逸 當然也可以30天到期後,再這樣解決,再用30天,迴圈下去。如果你的電腦可以永久不關,可以保持plsql登入的介面不關閉,這樣就可避免這些重複的操作了 以下內容更新於2019年10月2...

如何解決MATLAB還有X天過期的問題

基本思路是,建立乙個bat檔案,使計算機可以自動地先將日期改為乙個足夠早的日期,再啟動matlab,最後再恢復系統日期。需要注意的是,bat檔案應以管理員身份執行,而且bat檔案中,在啟動matlab的命令之後,應做一定的延時 如3秒 再恢復系統日期。大家應根據自己的系統的日期格式修改下面bat中的...