我正在将 memcached 与 PHP 一起使用,以尝试进行大量缓存以避免数据库读取。我在更新时使缓存无效(应用程序无效)。但是,过时的缓存数据正在成为一个大问题。大多数情况下,这是由于失效中的错误(使错误的密钥失效或忘记使更新上的缓存条目失效)。
在开发/生产过程中是否有任何好的方法来检测/调试这些类型的错误?
最好的办法是在 mysql_query 周围放置一个包装函数。在其中,只需检查查询是对缓存表的更新还是删除,并解析出正在更改的键。这不会花费很长时间来编写,易于测试,并且可以防止您再次忘记缓存失效。
您可以使用乐观并发控制,这涉及向表中添加一列(时间戳或等效项,或者只是一个普通的 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
您可以在应用程序中添加调试代码(在生产期间禁用),该代码执行两次提取 - 一次来自 memcached,一次来自数据库,比较它们并抛出异常/如果它们不同则将错误写入日志文件。这样(会损失一些性能)您可以快速观察旧数据。
当然,这可以进一步细化: