Symfony RedisAdapter具有不同的内部缓存键,具体取决于应用程序环境

Symfony RedisAdapter具有不同的内部缓存键,具体取决于应用程序环境,symfony,redis,symfony4,Symfony,Redis,Symfony4,我在symfony应用程序中使用redis缓存 在检查redis cli中内部使用的密钥时,我发现所有条目都共享一个公共前缀,如AWVAugkC6-:,或gBphwvED1G:。如果我在dev和prod之间切换APP_ENV,前缀将更改 我可以禁用此行为吗 目前,我无法在开发模式下使用prod条目,反之亦然 打电话给 $this->cache->getItem('2f560421-1b6d-4251-8392-e9c0f5e824a7-1514764800-1546300799-no

我在symfony应用程序中使用redis缓存

在检查redis cli中内部使用的密钥时,我发现所有条目都共享一个公共前缀,如AWVAugkC6-:,或gBphwvED1G:。如果我在dev和prod之间切换APP_ENV,前缀将更改

我可以禁用此行为吗

目前,我无法在开发模式下使用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
然而在prod中,它是

AWVAugkC6-:2f560421-1b6d-4251-8392-e9c0f5e824a7-1514764800-1546300799-noref-nostr
所以前缀被交换了

我将其追溯到AbstractTrait::getId$key,但我认为这一行应该只是散列give键,而不是环境

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不共享相同的缓存项,这在默认情况下是安全的。这是在使用语义配置时完成的,在编译器过程中,如下所示:

如果您想退出,可能需要将缓存池直接定义为服务,而不使用语义配置。然后,您将完全控制名称空间和其他所有内容

您还可以继续使用语义并重新定义kernel.container_类参数。我认为这可以通过覆盖内核上的getContainerClass来实现


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

谢谢!然后我将定义服务!