Symfony RedisAdapter 根据应用程序环境有不同的内部缓存键

Symfony RedisAdapter has different internal cache keys depending on app environment

我在我的 symfony 应用程序中使用了一个 redis 缓存。

在检查 redis-cli 中内部使用的键时,我发现所有条目共享一个公共前缀(如 AWVAugkC6-:gBphwvED1G:)。如果我在 devprod 之间切换 APP_ENV,前缀就会改变。

我可以禁用此行为吗?

目前,我无法在开发模式下使用产品条目,反之亦然。

电话

$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 相关。实际上,存储了一个额外的标签条目,

计算前缀是为了确保 dev 和 prod 不共享相同的缓存项,默认情况下是安全的。这是在编译器传递中使用语义配置时完成的,此处:

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

如果您想选择退出,您可能需要将缓存池直接定义为服务 - 而无需使用语义配置。然后您将完全控制命名空间和其他一切。

您也可以继续使用语义并重新定义kernel.container_class参数。我认为这可以通过覆盖内核上的 getContainerClass 来完成。

但是你应该首先仔细检查为什么你需要为 prod 和 dev 使用相同的命名空间。