Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Доброго времени суток. Не могу до конца понять как работает Кэш в ларе.
Значит ситуация такая. Допустим есть модель Articles.
class Article {
public function getArticles() {
$articles = Cache::remember('articles', 24*60, function () {
return Article::with('lang')->get();
});
return $articles;
}
}
Как при удалении какой то существующей статьи, удалить ее из кэша в том числе ? Или как при добавлении новой статьи так же добавить ее в уже существующий кеш ?
На сколько я понял из документации метод remember должен автоматически чистить/добавлять записи в указанный кеш. Правильно ли я понял ? По тому что если да то почему-то на Laravel 5.4 работает это не совсем как ожидается. При добавлении/удалении записи она удаляется из бд но остается в кеше, а ведь я показываю то что в кеше. При таком раскладе получается что при использование CRUD-a мне надо в начале всех методов (store, update, destroy), вбивать Cache::forget('articles'), то бишь удалять все записи из кэша что бы потом закешировать актуальные данные из бд. Все это не было бы так принципиально, да вот что делать если у меня будут 5000 записей в бд ? Получается если я добавлю/удалю какую-то статью у меня произойдет запрос на 5000 записей. Как можно этого избежать или какие альтернативы можно использовать/применить? Заранее спасибо за предоставленную помощь !!!
P.S используемый драйвер - file
Изменено MeKree (27.04.2018 01:26:45)
Не в сети
Не правильно понял. Автоматически из кэша она никуда не денется.
При добавлении / удалении / редактировании записи нужно чистить кэш.
Не в сети
Не в сети
А зачем все статьи из базы кешировать?
Сам до конца не понял. Поставлена такая задача по ТЗ, значит надо решить.
Получается единственный выход это каждый раз при добавления/обновления/удаления придется через Cache::forget(), чистить все записи из кэша !? Другого способа нет?
Была конечно идея каждую отдельную кешировать через Cache::put('article-'.$this->id); а потом сравнивать бд и кеш и при не соответствии подтягивать изменённую статью или удалять при отсутствии, но как по мне это полный аншлаг. Куча ненужных записей и if внутри foreach который только увеличит время обработки что в корне убивает смысл использования Cache.
Может у кого есть ещё идеи по реализации !
P.S на счёт кеширования всех записей -> я так понимаю что это надо не только для front, и задача такая по тому что заказчик хочет чтобы в админке так же все записи были закешированы .
Изменено MeKree (27.04.2018 14:30:10)
Не в сети
Неправильно кешировать все записи, в этом нет абсолютно никакого смысла.
Кеш призван снизить нагрузку на сервер, увеличить скорость отдачи.
Но в вашем случае если записей много вы наоборот увеличите нагрузку, т.к. тот же memcached не воздухом питается, а ресурсами сервера.
Кешировать нужно только там где это имеет смысл, например вывод записей на главной странице или в категориях.
Вы же не выводите на экране разом все записи? Скорее всего у вас стоит пагинация, скажем по 10-15 записей.
Есть смысл закешировать первую страницу.
Если пользователи часто заходят дальше первой страницы можно закешировать по ключам типа 'articles_page_$n', в данном случае так же актуально использовать группы, чтобы при добавлении/редактировании статьи не обнулять весь кеш приложения.
То, что отдается пользователю редко - кешировать противопоказано, например результат поиска, фильтров и т.д.
Изменено Hardoff (27.04.2018 17:52:29)
Не в сети
Страницы 1