并发写入memcache

时间:2013-06-10 14:58:34

标签: php mysql memcached

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

我这样做:

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

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

你能推荐一种模式让我在php中做一个互斥,或类似的东西,只对mysql做一个慢速请求。

1 个答案:

答案 0 :(得分:2)

这被称为狗堆问题。 Strategy: Break Up The Memcache Dog Pile 描述了两种方法:

解决方案1:

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

解决方案2:

  • 在memcached中创建两个密钥:MAIN密钥,其到期时间略高于正常值+一个STALE密钥,该密钥会在之前到期。
  • 也可以阅读STALE键。如果陈旧过期,请重新计算并再次设置陈旧密钥。