2009-01-29 54 views
5

我正在使用memcached與PHP嘗試重度緩存,以避免分貝讀取。我正在使更新中的緩存無效(應用程序無效)。但是,陳舊的緩存數據正在成爲一個大問題。大多數情況下,這是由於無效中的錯誤(使錯誤鍵無效或忘記在UPDATE中使緩存項無效)。如何檢測和調試陳舊的緩存條目?

在開發/生產過程中是否有任何好的方法來檢測/調試這些類型的錯誤?

回答

0

您可以使用樂觀併發控制,它包括向表中添加一列(時間戳或同等值,或只是一個普通的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 
3

最好的辦法是在mysql_query周圍放置一個包裝函數。在那裏,只需檢查查詢是否是更新或刪除到緩存表並解析出正在更改的鍵。這不會花費很長時間來編寫,很容易測試,並且會阻止您再次忘記緩存失效。

0

您可以在您的應用程序中添加調試代碼(在生產期間禁用),該調試代碼執行兩次提取 - 一次來自memcached,另一次來自數據庫,比較它們並引發異常/將錯誤寫入日誌文件不同。這樣(有些性能損失),您可以快速觀察舊數據。

當然,這可以進一步細化:

  • 添加時間戳字段,如果時間戳比規定值更接近(也許過程中沒來得及更新不會引發錯誤緩存)
  • 在DB中添加一個指定更新源(腳本/行號)的字段。這可以幫助追蹤錯過高速緩存失效部分的部分