5

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

在开发/生产过程中是否有任何好的方法来检测/调试这些类型的错误?

4

3 回答 3

3

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

于 2009-02-05T21:15:45.040 回答
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
于 2009-01-29T13:20:03.197 回答
0

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

当然,这可以进一步细化:

  • 添加时间戳字段,如果时间戳比定义的值更接近,则不要抛出错误(可能进程没有时间更新缓存)
  • 在指定更新源(脚本/行号)的数据库中添加一个字段。这可以帮助追踪错过缓存失效部分的部分
于 2009-02-09T10:24:26.143 回答