3

你能帮我解决我的问题吗?我有一些缓慢的 mysql 查询,所以我将其结果缓存到 memcache 中。

我做这样的事情:

$data = get_from_cache();
if (! $data) {
   $data = get_from_mysql();
   set_cache($data);
}

问题。有时我每秒大约有 10 个请求。因此,当我的缓存到期时,我有 5-10 个 get-requests 同时启动这个慢速 mysql 查询。

你能推荐一种模式让我在 php 中创建一个互斥锁,或者类似的东西,只对 mysql 执行一个缓慢的请求。

4

1 回答 1

3

这被称为狗堆问题。策略:打破 Memcache Dog Pile描述了两种方法:

解决方案1:

  • 将缓存项的过期时间设置为将来。
  • 嵌入使用该值序列化的“真实”超时。例如,将项目设置为 24 小时后超时,但嵌入的超时可能是未来 5 分钟。
  • 在从缓存中获取时确定陈旧的超时是否已过期,并在过期时立即设置未来的时间并按原样重新存储数据。这关闭了风险窗口。
  • 从数据库中获取数据并使用最新值更新缓存。

解决方案2:

  • 在 memcached 中创建两个键:到期时间略高于正常值的 MAIN 键 + 一个更早过期的 STALE 键。
  • 在读取 STALE 键上也是如此。如果陈旧已过期,请重新计算并再次设置陈旧密钥。
于 2013-06-10T15:08:07.433 回答