Кеширование
Кеширование
Скажите пожалуйста, когда я кеширую MYSQL-запросы, как написано в документации, например на 600 секунд.
$customer = $db->createCommand('SELECT * FROM customer WHERE id=1')->cache(600)->queryOne();
Почему при добавлении, например в таблицу customer нового значения, оно начинается выводиться сразу, а не через 600 секунд, когда истечет кеш ?
$customer = $db->createCommand('SELECT * FROM customer WHERE id=1')->cache(600)->queryOne();
Почему при добавлении, например в таблицу customer нового значения, оно начинается выводиться сразу, а не через 600 секунд, когда истечет кеш ?
Re: Кеширование
А как вы по id=1 находите новое значение?
Кэшируется запрос 'SELECT * FROM customer WHERE id=1'
Запроса 'SELECT * FROM customer WHERE id=OTHER_ID' в кэше не будет.
Кэшируется запрос 'SELECT * FROM customer WHERE id=1'
Запроса 'SELECT * FROM customer WHERE id=OTHER_ID' в кэше не будет.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Re: Кеширование
Это я пример взял из документации для примера вот здесь :
https://yiiframework.com.ua/ru/doc/guid ... hing-data/
Запрос у меня всегда одинаковый, никаких переменных в запросе нет. Но при добавлении в базу новых данных, они сразу появляются в результатах запроса, если все делать через "->cache(600)"
https://yiiframework.com.ua/ru/doc/guid ... hing-data/
Запрос у меня всегда одинаковый, никаких переменных в запросе нет. Но при добавлении в базу новых данных, они сразу появляются в результатах запроса, если все делать через "->cache(600)"
Re: Кеширование
Проблема в вашем запросе, разбирайтесь.
Re: Кеширование
В дебагере же все есть.. Сколько реальных запросов идет без кеша
Re: Кеширование
Запрос из документации работает правильно. Ваш запрос не работает. Покажите свой код, будет понятно, что с ним не так.
Re: Кеширование
Конкретно у меня вот такой вот запрос :
В дебагере да, на второй заход на страничку, этого запроса нет, но факт в том, что он не 3600 секунд кешируется, а намного меньше.
Но если я возьму кеширование не через Yii, а просто через php, типа вот такого, то все работает :
Код: Выделить всё
$games = Yii::$app->db->createCommand("SELECT onf.*, seo.*,
FLOOR(TO_DAYS(NOW())-TO_DAYS(FROM_UNIXTIME(dateadded))) as putdate
FROM on_files AS onf
LEFT JOIN seotext AS seo ON onf.fileid = seo.item_id AND seo.class = 'app\\\models\\\OnFiles'
INNER JOIN vote_aggregate as va ON onf.fileid = va.target_id
WHERE onf.status = '1'
ORDER BY va.positive DESC")
->cache(3600)
->queryAll();
Но если я возьму кеширование не через Yii, а просто через php, типа вот такого, то все работает :
Код: Выделить всё
if($oCache->getData("new_query2")) { // если в мемкеше есть ключ
$most_popular_rowarr3 = $oCache->getData("new_query2"); // получение данных
} else {
$most_nov = DB::query("SELECT icon,title,title_en, fileid, rating, rating_n,
FLOOR(TO_DAYS(NOW())-TO_DAYS(FROM_UNIXTIME(dateadded))) as putdate,
timesplayed, video, description, description_en
FROM on_files
WHERE status = '1'
ORDER BY timesplayed DESC");
while($row3 = mysqli_fetch_assoc($most_nov)) $most_popular_rowarr3[] = $row3;
$oCache->setData("new_query2", $most_popular_rowarr3); // сохранение данных
}
Re: Кеширование
Думается дело в NOW()
Попробуйте вынести вычисление FLOOR(TO_DAYS(NOW()) до запроса
P.S.
Хотя, посмотрел, не должно влиять
просто я для кеширования запросов использую встроенный в MySQL кешер, а он не любит NOW
для отлова почему не работает кеширование запроса - я бы в queryInternal своего отладочного вывода добавил.
думаю, что-то все же меняется у вас при формировании ключа.
Попробуйте вынести вычисление FLOOR(TO_DAYS(NOW()) до запроса
P.S.
Хотя, посмотрел, не должно влиять
Код: Выделить всё
// yii\db\Command
$cacheKey = [
__CLASS__,
$method,
$fetchMode,
$this->db->dsn,
$this->db->username,
$rawSql ?: $rawSql = $this->getRawSql(),
];
$result = $cache->get($cacheKey);
для отлова почему не работает кеширование запроса - я бы в queryInternal своего отладочного вывода добавил.
думаю, что-то все же меняется у вас при формировании ключа.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.
Re: Кеширование
https://github.com/yiisoft/yii2/blob/ma ... %BE%D0%B2-
Код: Выделить всё
$games = Yii::$app->cache(function($db) {
return $db->createCommand("SELECT onf.*, seo.*,
FLOOR(TO_DAYS(NOW())-TO_DAYS(FROM_UNIXTIME(dateadded))) as putdate
FROM on_files AS onf
LEFT JOIN seotext AS seo ON onf.fileid = seo.item_id AND seo.class = 'app\\\models\\\OnFiles'
INNER JOIN vote_aggregate as va ON onf.fileid = va.target_id
WHERE onf.status = '1'
ORDER BY va.positive DESC")->queryAll();
});
Re: Кеширование
Судя по приведённому коду, всё должно работать. Значит, где-то ещё ошибка.
Может при добавлении очистка кеша производится?
Может при добавлении очистка кеша производится?
Re: Кеширование
что такое встроенный в mysql кэшер?skynin писал(а): ↑2018.02.08, 11:48 Думается дело в NOW()
Попробуйте вынести вычисление FLOOR(TO_DAYS(NOW()) до запроса
P.S.
Хотя, посмотрел, не должно влиять
просто я для кеширования запросов использую встроенный в MySQL кешер, а он не любит NOWКод: Выделить всё
// yii\db\Command $cacheKey = [ __CLASS__, $method, $fetchMode, $this->db->dsn, $this->db->username, $rawSql ?: $rawSql = $this->getRawSql(), ]; $result = $cache->get($cacheKey);
Re: Кеширование
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.
Re: Кеширование
это совсем не то же, что и кэш приложения. Это внутренняя оптимизация. Расчитывать на него не стоит от слова совсем. Даже без учета того, что это deprecated и выпилится в следующей версии.
Re: Кеширование
Конечно не то же.
Просто часто и не потребуется кеширование данных на уровне приложения.
Не совсем понятно что такое - внутренняя оптимизация.
Использую много лет.
Иногда просто нужно схему БД проектировать с его учетом - чтобы не сбрасывался.
это да, в 8.0 его не будет.
значит не надо спешить переходить на 8ую версию.
в 5.7 прекрасно работает.
Не смотрел что там с ним будет у MariaDB.
Он очень удобен для сценариев где преимущественно чтение из БД.
Выпиливают его потому что при работе на запись, он не только бесполезен, а еще и притормаживает, из-за монопольного захвата памяти для очистки.
MySQL 8.0: Retiring Support for the Query Cache
Но не суть, с NOW() он все равно не работал бы.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.