【问题标题】:How to avoid cache slams in laravel?如何避免 laravel 中的缓存猛击?
【发布时间】: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”之类的例子)。

【问题讨论】:

标签: php laravel caching redis memcached


【解决方案1】:

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

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

【讨论】:

  • 是的,我已经阅读了那篇文章,但我需要它是新鲜的,不能在一分钟内完成一次。我需要 5-10 秒一次
  • 有一个排队的作业,它运行并重新排队,延迟 5-10 秒?
  • @Dwight 是的,可能是一件事
猜你喜欢
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 2012-10-14
相关资源
最近更新 更多