Laravel по-русски

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

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

#1 06.09.2017 15:39:53

Как правильно закешировать большие объемы данных

Здравствуйте.
У меня есть несколько (моделей?) таблиц которые очень редко меняются. К примеру категории, поставщики, таксы, атрибуты, характеристики. Они меняются очень редко. Я решил закешировать их, но как правильно это сделать? Я сделал так.
Создал CacheServiceProvider, и в нем такой код

PHP
        // Cache categories
        
Cache::rememberForever('categories', function (){
            return 
Category::with('children')->parent()->orderBy('parent_id''asc')->get(['id''name''parent_id'])->all();
        });
        
// Cache attributes with values
        
Cache::rememberForever('attributes', function (){
            return 
Attribute::with(['values' => function($q) {$q->orderBy('sort_order''asc');}])->orderBy('sort_order''asc')->get()->all();
        });
        
// Cache languages
        
Cache::rememberForever('languages', function (){
            return 
Language::orderBy('name''asc')->get()->all();
        });
        
// Cache carriers
        
Cache::rememberForever('carriers', function (){
            return 
Carrier::orderBy('name''asc')->get()->all();
        });
        
// Cache currencies
        
Cache::rememberForever('currencies', function (){
            return 
Currency::orderBy('name''asc')->get()->all();
        });
        
// Cache features with values
        
Cache::rememberForever('features', function (){
            return 
Feature::with(['values' => function($q) {$q->orderBy('sort_order''asc');}])->orderBy('sort_order''asc')->get()->all();
        });
        
// Cache tax
        
Cache::rememberForever('taxes', function (){
            return 
Tax::orderBy('name''asc')->get()->all();
        });
        ...

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

Не в сети

#2 12.09.2017 14:12:11

Re: Как правильно закешировать большие объемы данных

сервис-провайдеры отрабатывают на каждый запрос, это значит что на каждый запрос даже на горячем кэше будет выбираться (и потом выбрасываться) каждый из справочников. если справочники действительно большие – это лишняя нагрузка на кэш и на пхп. кроме того сама логика выборки данных – прерогатива модели. соответственно, методы выборки из кэша/базы полного списка записей также нужно размещать на модели.

я бы перекрыл в моделях метод all(). тогда код просто будет обращаться к Category::all() не беспокоясь о том как именно и откуда будут выбраны записи. а вот внутри all() уже сделать return cache()->rememberForever(…)

Не в сети

#3 13.09.2017 18:16:34

Re: Как правильно закешировать большие объемы данных

Спасибо за ответ.
А как быть когда кеша нет?
Тоесть: лежали все категории в кеше, тут добавилась новая категория, и соответственно удаляю категории из кеша, но потом они получается автоматически не закешируются опять же? Или закешируются? Я немного непонимаю. Можно пример с кодом если не трудно?

Не в сети

#4 13.09.2017 19:38:27

Re: Как правильно закешировать большие объемы данных

rememberForever выполнить твой closure если кэш не найден и запишет в кэш.
т.е. автоматически закэшируются.

Изменено covobo (13.09.2017 19:38:54)

Не в сети

#5 13.09.2017 22:13:25

Re: Как правильно закешировать большие объемы данных

Я не дочитал сообщение constb до конца, и по этому небыло понятно.
Спасибо covobo и constb

Не в сети

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