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

时间:2019-03-20 23:17:18

标签: symfony redis symfony4

我在symfony应用程序中使用Redis缓存。

检查redis-cli中内部使用的密钥时,我发现所有条目都共享一个公共前缀(例如AWVAugkC6-:gBphwvED1G:)。如果我在APP_ENVdev之间切换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,但是我认为这一行应该只是散列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有关。实际上,会存储一个额外的标签条目,

1 个答案:

答案 0 :(得分:1)

计算前缀以确保dev和prod不共享相同的缓存项,默认情况下是安全的。当使用语义配置时,可以在编译器遍历中完成此操作,

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

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

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

但是您应该首先仔细检查为什么生产和开发需要相同的名称空间。