Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 27.04.2018 01:25:09

Работа с кешем

Доброго времени суток. Не могу до конца понять как работает Кэш в ларе.
Значит ситуация такая. Допустим есть модель 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)

Не в сети

#2 27.04.2018 08:26:00

Re: Работа с кешем

Не правильно понял. Автоматически из кэша она никуда не денется.
При добавлении / удалении / редактировании записи нужно чистить кэш.

Не в сети

#3 27.04.2018 10:44:41

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Работа с кешем

А зачем все статьи из базы кешировать? Кешируй только те, которые к примеру на главной выводить будишь.
При сохранении / обновлении / удалении статьи, можно использовать Observer что бы очищать / обновлять кеш.

Не в сети

#4 27.04.2018 14:27:49

Re: Работа с кешем

А зачем все статьи из базы кешировать?

Сам до конца не понял. Поставлена такая задача по ТЗ, значит надо решить.
Получается единственный выход это каждый раз при добавления/обновления/удаления придется через Cache::forget(), чистить все записи из кэша !? Другого способа нет?
Была конечно идея каждую отдельную кешировать через Cache::put('article-'.$this->id); а потом сравнивать бд и кеш и при не соответствии подтягивать изменённую статью или удалять при отсутствии, но как по мне это полный аншлаг. Куча ненужных записей и if внутри foreach который только увеличит время обработки что в корне убивает смысл использования Cache.
Может у кого есть ещё идеи по реализации !
P.S на счёт кеширования всех записей -> я так понимаю что это надо не только для front, и задача такая по тому что заказчик хочет чтобы в админке так же все записи были закешированы .

Изменено MeKree (27.04.2018 14:30:10)

Не в сети

#5 27.04.2018 17:48:38

Re: Работа с кешем

Неправильно кешировать все записи, в этом нет абсолютно никакого смысла.

Кеш призван снизить нагрузку на сервер, увеличить скорость отдачи.
Но в вашем случае если записей много вы наоборот увеличите нагрузку, т.к. тот же memcached не воздухом питается, а ресурсами сервера.

Кешировать нужно только там где это имеет смысл, например вывод записей на главной странице или в категориях.
Вы же не выводите на экране разом все записи? Скорее всего у вас стоит пагинация, скажем по 10-15 записей.
Есть смысл закешировать первую страницу.

Если пользователи часто заходят дальше первой страницы можно закешировать по ключам типа 'articles_page_$n', в данном случае так же актуально использовать группы, чтобы при добавлении/редактировании статьи не обнулять весь кеш приложения.

То, что отдается пользователю редко - кешировать противопоказано, например результат поиска, фильтров и т.д.

Изменено Hardoff (27.04.2018 17:52:29)

Не в сети

Подвал раздела