Как избежать взлома кэша в laravel? - PullRequest
1 голос
/ 02 декабря 2019

как избежать сбоев кэша (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 и т. Д., Так что мне нужнотолько один из них записывает в этот кеш, а все остальные должны его ждать. Как мне это сделать?

этот, вероятно, как-то связан с атомарными блокировками, но мне не ясно, как мне его использовать, документация не для меня (это слишком много "привет, мир")-подобный пример).

1 Ответ

0 голосов
/ 02 декабря 2019

Единственное безопасное решение - никогда не вызывать Cache из контекста пользовательских запросов. Задание cron, которое обращается к локальному URL-адресу для обновления данных кэша, совершенно безопасно от таких условий гонки и связанных с этим отказов памяти.

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

...