Кэширование запросов к БД на время жизни приложения

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Кэширование запросов к БД на время жизни приложения

Сообщение PendalF »

Здравствуйте!
Есть ли возможность класть запросы в кэш, только на время lifecycle приложения?
Например, есть метод в классе, который делает запрос к базе и возвращает определённые данные. Я его дёргаю в разных местах в приложении и хочу, чтобы не было лишних запросов к базе.
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Кэширование запросов к БД на время жизни приложения

Сообщение PendalF »

Да думал про это, может указывать секунды 3. Но думаю, что как-то костыльно это.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Кэширование запросов к БД на время жизни приложения

Сообщение yan »

PendalF писал(а):Здравствуйте!
Есть ли возможность класть запросы в кэш, только на время lifecycle приложения?
Например, есть метод в классе, который делает запрос к базе и возвращает определённые данные. Я его дёргаю в разных местах в приложении и хочу, чтобы не было лишних запросов к базе.
закэшируйте эти определённые данные в стат свойстве класса, если они не меняются за время жизни конечно, а обращение к системе кэша в любом случае не такая уж легкая операция, как минимум это включает десериализацию
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Кэширование запросов к БД на время жизни приложения

Сообщение PendalF »

Типа такого?

Код: Выделить всё

class ApartmentsCountProvider extends Object
{
    /**
     * @var array хранит результаты запросов
     */
    protected static $cache;

    
    public function getCount()
    {
        if (!isset(self::$cache[__METHOD__])) {
            self::$cache[__METHOD__] = Yii::$app->rb->createCommand('ЗАПРОС')->queryScalar();
        }
        
        return self::$cache[__METHOD__];
    }
}
 
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Кэширование запросов к БД на время жизни приложения

Сообщение PendalF »

Только в этом случае метод getCount тоже должен быть статичный. Пожалуй, это подойдёт. Спасибо, Ян!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Кэширование запросов к БД на время жизни приложения

Сообщение zelenin »

PendalF писал(а):Здравствуйте!
Есть ли возможность класть запросы в кэш, только на время lifecycle приложения?
Например, есть метод в классе, который делает запрос к базе и возвращает определённые данные. Я его дёргаю в разных местах в приложении и хочу, чтобы не было лишних запросов к базе.
ArrayCache - то, что вам нужно.
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Кэширование запросов к БД на время жизни приложения

Сообщение girmate »

zelenin писал(а):
PendalF писал(а):Здравствуйте!
Есть ли возможность класть запросы в кэш, только на время lifecycle приложения?
Например, есть метод в классе, который делает запрос к базе и возвращает определённые данные. Я его дёргаю в разных местах в приложении и хочу, чтобы не было лишних запросов к базе.
ArrayCache - то, что вам нужно.
Проясните мне ситуацию. Я в одном своем проекте в разных местах дергал базу данных для получения разных настроек сайта. Получалось несколько запросов. То есть я мог это где-то один раз закешировать и и оттуда считывать? Имею в виду не разные запросы, а именно во время жизни приложения, в разных частях сайта (на одной странице), виджетах и так далее.
Осторожно! Вы общаетесь с новичком ;)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Кэширование запросов к БД на время жизни приложения

Сообщение zelenin »

girmate писал(а):
zelenin писал(а):
PendalF писал(а):Здравствуйте!
Есть ли возможность класть запросы в кэш, только на время lifecycle приложения?
Например, есть метод в классе, который делает запрос к базе и возвращает определённые данные. Я его дёргаю в разных местах в приложении и хочу, чтобы не было лишних запросов к базе.
ArrayCache - то, что вам нужно.
Проясните мне ситуацию. Я в одном своем проекте в разных местах дергал базу данных для получения разных настроек сайта. Получалось несколько запросов. То есть я мог это где-то один раз закешировать и и оттуда считывать? Имею в виду не разные запросы, а именно во время жизни приложения, в разных частях сайта (на одной странице), виджетах и так далее.
да
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Кэширование запросов к БД на время жизни приложения

Сообщение PendalF »

О, в самом деле то что нужно! Спасибо)
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Кэширование запросов к БД на время жизни приложения

Сообщение PendalF »

Только мне не совсем понятно насчёт параметра duration у ArrayCache. Получается, он там нужен для того, чтобы в миллисекундах определить срок кэша (до момента как закончится жизненный цикл приложения), а если поставить 0, то кэш "просрочится", как только будет закончен жизненнный цикл приложения? Верно?
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Кэширование запросов к БД на время жизни приложения

Сообщение girmate »

Я вот не помню как выкручивался. Кажется передавал в вид и виджеты, общие настройки приложения из БД. Но не везде получалось. А об этом как-то и не задумывался. Спасибо. Теперь я смогу один раз считать все настройки приложения и использовать везде где нужно. Ведь часть настроек касается отображения (например, сколько товаров выводить на страницу), другая часть вообще не связана никак с отображением. Все я загнал в таблицу Settings (всего одна строка и куча полей) и дергал повсюду где надо и не надо. А вот теперь понял что нужно было закешировать один раз где-то и вызывать где нужно.
Осторожно! Вы общаетесь с новичком ;)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Кэширование запросов к БД на время жизни приложения

Сообщение zelenin »

PendalF писал(а):Только мне не совсем понятно насчёт параметра duration у ArrayCache. Получается, он там нужен для того, чтобы в миллисекундах определить срок кэша (до момента как закончится жизненный цикл приложения), а если поставить 0, то кэш "просрочится", как только будет закончен жизненнный цикл приложения? Верно?
ArrayCache - такой же кэш как и все остальные, но не сохраняемый в хранилище.
Ответить