【发布时间】:2020-03-26 13:25:01
【问题描述】:
如何避免缓存猛击 (https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/caching.html#cache-slams) ?这个问题不是关于教义,而是一般的缓存
我需要这样的东西
//pseudo code
// $cacheKey = 'randomCacheKey'.
if(Cache::has($cacheKey)) {
return Cache::get($cacheKey);
}
//do some work
$valueToCache = $this->someComplexTask();
Cache::set($cacheKey, $valueToCache);
return $valueToCache;
问题是,我需要怎么做才能避免缓存猛击? 例如,如果我有 200 个并行请求,并且它们都会注意到没有缓存,它们都会尝试写入相同的键,这将导致 cpu/memory/db 查询等出现峰值。 所以我只需要其中一个来写入这个缓存,所有其他人都应该等待它。我该怎么做?
这可能与原子锁有关,但我不清楚如何使用它,因为它不是我的文档(这是太多“hello world”之类的例子)。
【问题讨论】:
-
您可以提前预热缓存,也可以利用锁定机制确保只有 1 个请求会写入缓存
-
@PtrTon 是的,我想使用锁定,但我不知道如何使用。我怕我会打自己的脸
-
在锁定方面我更喜欢使用 [symfony 锁定组件[(symfony.com/doc/current/components/lock.html)。它支持 6 种不同的锁定存储,并且有很好的文档记录。
标签: php laravel caching redis memcached