Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检测和调试过时的缓存项?_Php_Debugging_Caching_Memcached - Fatal编程技术网

Php 如何检测和调试过时的缓存项?

Php 如何检测和调试过时的缓存项?,php,debugging,caching,memcached,Php,Debugging,Caching,Memcached,我将memcached与PHP结合使用,尝试进行大量缓存以避免数据库读取。我在更新时使缓存失效(应用程序失效)。但是,过时的缓存数据正在成为一个大问题。大多数情况下,这是由于失效中的错误(使错误的键失效或在更新时忘记使缓存项失效) 有什么好方法可以在开发/生产过程中检测/调试这些类型的bug吗?您可以使用乐观并发控制,它包括向表中添加一列(时间戳或等效列,或仅添加一个纯整数),并在执行更新时使用它。下面是您可以如何使用它(如果纯int是“版本标记”): 假设时间戳由DBMS自动更新,则时间戳就是

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


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

您可以使用乐观并发控制,它包括向表中添加一列(时间戳或等效列,或仅添加一个纯整数),并在执行更新时使用它。下面是您可以如何使用它(如果纯int是“版本标记”):

假设时间戳由DBMS自动更新,则时间戳就是这样做的:

update BlogPost set PublishedOn = :publishedOn
where ID = :id and Timestamp = :timestamp

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

您可以在应用程序中添加调试代码(在生产过程中禁用),该代码执行两次获取-一次来自memcached,另一次来自DB,比较它们并引发异常/如果它们不同,则将错误写入日志文件。这样(在性能有所损失的情况下)您可以快速观察旧数据

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

  • 添加时间戳字段,如果时间戳比定义的值更接近,则不要抛出错误(可能进程没有时间更新缓存)
  • 在数据库中添加一个字段,指定更新源(脚本/行号)。这有助于跟踪未命中缓存失效部分的部分
update BlogPost set PublishedOn = :publishedOn
where ID = :id and Timestamp = :timestamp