我正在使用memcached與PHP嘗試重度緩存,以避免分貝讀取。我正在使更新中的緩存無效(應用程序無效)。但是,陳舊的緩存數據正在成爲一個大問題。大多數情況下,這是由於無效中的錯誤(使錯誤鍵無效或忘記在UPDATE中使緩存項無效)。如何檢測和調試陳舊的緩存條目?
在開發/生產過程中是否有任何好的方法來檢測/調試這些類型的錯誤?
我正在使用memcached與PHP嘗試重度緩存,以避免分貝讀取。我正在使更新中的緩存無效(應用程序無效)。但是,陳舊的緩存數據正在成爲一個大問題。大多數情況下,這是由於無效中的錯誤(使錯誤鍵無效或忘記在UPDATE中使緩存項無效)。如何檢測和調試陳舊的緩存條目?
在開發/生產過程中是否有任何好的方法來檢測/調試這些類型的錯誤?
您可以使用樂觀併發控制,它包括向表中添加一列(時間戳或同等值,或只是一個普通的int)並在更新時使用它。下面是如何使用它(在普通int是一個「版本標記」的情況下):
update BlogPost set PublishedOn = :publishedOn, VersionTag = VersionTag + 1
where ID = :id and VersionTag = :versionTag
並假設時間戳是由你的DBMS自動更新,這是它是如何與時間戳進行:
update BlogPost set PublishedOn = :publishedOn
where ID = :id and Timestamp = :timestamp
最好的辦法是在mysql_query周圍放置一個包裝函數。在那裏,只需檢查查詢是否是更新或刪除到緩存表並解析出正在更改的鍵。這不會花費很長時間來編寫,很容易測試,並且會阻止您再次忘記緩存失效。
您可以在您的應用程序中添加調試代碼(在生產期間禁用),該調試代碼執行兩次提取 - 一次來自memcached,另一次來自數據庫,比較它們並引發異常/將錯誤寫入日誌文件不同。這樣(有些性能損失),您可以快速觀察舊數據。
當然,這可以進一步細化: