Symfony RedisAdapter имеет разные ключи внутреннего кэша в зависимости от среды приложения - PullRequest
0 голосов
/ 21 марта 2019

Я использую кэш redis в моем приложении Symfony.

При проверке внутренних ключей в redis-cli я обнаружил, что все записи имеют общий префикс (например, AWVAugkC6-: или gBphwvED1G:). Префикс меняется, если я переключаю APP_ENV между dev и prod.

Можно ли отключить это поведение?

В настоящее время я не могу использовать записи prod в режиме разработки и наоборот.

Звонок на

$this->cache->getItem('2f560421-1b6d-4251-8392-e9c0f5e824a7-1514764800-1546300799-noref-nostr');

переводит в devmode на ключ redis

gBphwvED1G:2f560421-1b6d-4251-8392-e9c0f5e824a7-1514764800-1546300799-noref-nostr

однако в продукт, это

AWVAugkC6-:2f560421-1b6d-4251-8392-e9c0f5e824a7-1514764800-1546300799-noref-nostr

Итак, префикс заменен!

Я проследил это до AbstractTrait::getId($key) https://github.com/symfony/cache/blob/e5e9a6d35558b43cca49cde9f3a7ad22980812cb/Traits/AbstractTrait.php#L269,, но я думаю, что эта строка должна просто хешировать ключ давать, а не среду ...?

framework:
    cache:
        default_redis_provider: 'redis://%env(REDIS_HOST)%'
        pools:
            data_evaluator_cache_items_cache:
                adapter: cache.adapter.redis
                default_lifetime: 0
                public: true
            data_evaluator_cache_tags_cache:
                adapter: cache.adapter.redis
                default_lifetime: 0
                public: true 
services:
    tagged_data_cache:
        class: Symfony\Component\Cache\Adapter\TagAwareAdapter
            arguments:
                $itemsPool: "@data_evaluator_cache_items_cache"
                $tagsPool: "@data_evaluator_cache_tags_cache"
        public: true

Я не уверен, относится ли это к TagAwareAdapter. В действительности сохраняется дополнительная запись тега, которая

1 Ответ

1 голос
/ 21 марта 2019

Префикс вычисляется, чтобы гарантировать, что dev и prod не используют одни и те же кэшированные элементы, чтобы быть безопасными по умолчанию.Это делается при использовании семантической конфигурации на этапе компиляции здесь:

https://github.com/symfony/cache/blob/master/DependencyInjection/CachePoolPass.php#L55

Если вы хотите отказаться от этого, вам может потребоваться определить пулы кэша непосредственно каксервис - без использования семантической конфигурации.После этого вы получите полный контроль над пространством имен и всем остальным.

Вы также можете продолжать использовать семантику и переопределить параметр kernel.container_class.Я думаю, что это можно сделать, переопределив getContainerClass в вашем Ядре.

Но сначала вам нужно проверить, зачем вам одинаковое пространство имен для prod и dev.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...