php - Laravel 中如何避免缓存碰撞?

标签 php laravel caching redis memcached

如何避免缓存猛击 (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/内存/数据库查询等出现峰值。 所以我只需要其中一个写入该缓存,所有其他都应该等待它。我该怎么做?

这个可能与原子锁有关,但我不清楚如何使用它,因为它不适合我(它太多了“hello world”之类的例子)。

最佳答案

唯一安全的解决方案是永远不要从用户请求上下文中调用 Cache。命中本地 URL 来刷新缓存数据的 cron 作业完全不会受到此类竞争条件和相关内存搅动的影响。

http://notmysock.org/blog/php/user-cache-timebomb.html

关于php - Laravel 中如何避免缓存碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59130332/

相关文章:

ios - 缓存 URL 响应以使用 WKWebView 进行离线查看

php - Laravel:从 Blade 模板调用 Controller 类的方法

javascript - PHP json_decode 无法解析 JS JSON

php - 如果 laravel 4 不存在,则将特定路由重定向到页面

mysql - Laravel & PHPUnit : allow process isolation to prevent Mysql Too many connections error

java - Android缓存后台进程不断增加

php - 在 RegEx 中使用单词边界 (\b) 我需要在单词之前和之后,还是之前?

php - 用户访问被拒绝 & mysql_query() 期望参数 2 为资源

Laravel 5.1 刷新单个表并为其添加种子

asp.net-mvc - 如何在Asp.net Core中将缓存更新为并发请求?