我在symfony应用程序中使用Redis缓存。
检查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,但是我认为这一行应该只是散列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有关。实际上,会存储一个额外的标签条目,
答案 0 :(得分:1)
计算前缀以确保dev和prod不共享相同的缓存项,默认情况下是安全的。当使用语义配置时,可以在编译器遍历中完成此操作,
https://github.com/symfony/cache/blob/master/DependencyInjection/CachePoolPass.php#L55
如果要选择退出,则可能需要直接将缓存池定义为服务-而不使用语义配置。然后,您将完全控制名称空间和其他所有内容。
您还可以继续使用语义并重新定义kernel.container_class参数。我认为可以通过在内核上覆盖getContainerClass来实现。
但是您应该首先仔细检查为什么生产和开发需要相同的名称空间。