CakePHP 3.5.13 с Redis, настроенным как механизм кэширования:
// config/app.php
'Cache' => [
'default' => [
'className' => 'Redis',
'duration' => '+1 hours',
'prefix' => 'cake_redis_',
'host' => '127.0.0.1',
'port' => 6379,
],
];
У меня есть таблица с ~ 260 000 строк в ней и соответствующий класс Table с именем SubstancesTable.php
. Я пытаюсь получить первые 5000 строк, а затем кэшировать результаты, чтобы при последующих запросах использовались кэшированные результаты, а не выполнялся тот же запрос:
// Controller method
public function test()
{
$this->autoRender = false;
$Substances = TableRegistry::get('Substances');
// Get 5000 rows from table
$query = $Substances->find('list')->limit(5000);
// Write to cache
$query->cache('test_cache_key');
// Output the results
debug($query->toArray());
}
Когда я вхожу в Redis (запускаю redis-cli
через ssh на моем веб-сервере), я вижу, что был сгенерирован ключ с именем «test_cache_key»:
127.0.0.1:6379> KEYS *
1) "cake_redis_test_cache_key"
Я также могу увидеть там сериализованные данные, используя GET cake_redis_test_cache_key
.
Когда я выполняю вышеупомянутое в браузере, практически нет разницы во времени, затрачиваемом между кешем, не существующим, и после того, как кеш был создан. Я удалил кешированный ключ в Redis, используя DEL cake_redis_test_cache_key
, и подтвердил его, перечислив ключи в Redis (KEYS *
)
Очевидно, что в этой ситуации Cake не читает из кеша, хотя записывает в него без проблем. Почему это происходит?
Документация (https://book.cakephp.org/3.0/en/orm/query-builder.html#caching-query-results) не ясна. Нужно ли делать что-то еще, чтобы заставить ее читать результаты из кэша? Я также прочитал CakePHP 3: find () с кэшем но не вижу, что делается иначе, чем то, что я делаю выше.