【问题标题】:concurrency writings into memcache并发写入内存缓存
【发布时间】:2013-06-10 14:58:33
【问题描述】:

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

我会这样做:

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

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

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

【问题讨论】:

    标签: php mysql memcached


    【解决方案1】:

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

    解决方案 1:

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

    解决方案 2:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-17
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多