假设我们的 php 脚本每秒有 10K 请求。
每个请求都在检查 memcached(或任何其他缓存存储)中的缓存。如果找到缓存 - 一切正常并返回缓存值。如果未找到缓存,我们将执行慢速 SQL 查询来填充缓存。它是最常见和最简单的缓存方案:
$result = $this->loadFromCache($key);
if (empty($result)) {
$result = $this->makeSlowSqlQuery();
$this->writeToCache($key, $result);
}
//do something with $result;
在我们没有太多请求之前,该方案运行良好。一旦我们有太多的请求,我们将面临大量请求在缓存中找不到任何东西并尝试重新填充它的情况。所以它们都将开始执行慢速 SQL 查询,这将导致高负载影响。解决办法是什么?
作为可能的解决方案,我看到以下情况:发现缓存无效的第一个请求应该创建一些触发器,说明缓存重新填充已经开始,另一个请求应该等待新的缓存或使用旧的(以前的)版本。
你如何解决类似的问题?