CakePHP 3.x ORM не использует данные кэша, когда ключ существует - PullRequest
0 голосов
/ 14 сентября 2018

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 () с кэшем но не вижу, что делается иначе, чем то, что я делаю выше.

...