如何检测和调试过时的缓存条目?

时间:2009-01-29 13:13:22

标签: php debugging caching memcached

我正在使用memcached与PHP尝试进行大量缓存以避免数据库读取。我在更新时使缓存失效(应用程序无效)。但是,过时的缓存数据正成为一个大问题。大多数情况下,这是由于失效中的错误(使错误的密钥无效或忘记在UPDATE上使缓存条目无效)。

在开发/生产过程中有没有什么好方法可以检测/调试这些类型的错误?

3 个答案:

答案 0 :(得分:3)

最好的办法是在mysql_query周围放置一个包装函数。在其中,只需检查查询是更新还是删除缓存表并解析出正在更改的键。这不会花费很长时间来编写,易于测试,并且可以防止您再次忘记缓存失效。

答案 1 :(得分:0)

您可以使用乐观并发控制,它涉及向表中添加一个列(时间戳或等效,或只是一个普通的int)并在执行更新时使用它。以下是如何使用它(如果plain 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

答案 2 :(得分:0)

您可以在应用程序中添加调试代码(在生产期间禁用),它会执行两次读取 - 一次来自memcached,另一次来自数据库,比较它们并抛出异常/如果它们不同则将错误写入日志文件。通过这种方式(性能会有一些损失),您可以快速观察旧数据。

当然,这可以进一步完善:

  • 添加时间戳字段,如果时间戳接近定义值,则不抛出错误(可能是进程没有时间更新缓存)
  • 在DB中添加一个指定更新源(脚本/行号)的字段。这可以帮助追踪错过缓存失效部分的部分