Symfony RedisAdapter 根据应用程序环境有不同的内部缓存键
Symfony RedisAdapter has different internal cache keys depending on app environment
我在我的 symfony 应用程序中使用了一个 redis 缓存。
在检查 redis-cli
中内部使用的键时,我发现所有条目共享一个公共前缀(如 AWVAugkC6-:
或 gBphwvED1G:
)。如果我在 dev
和 prod
之间切换 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 使用相同的命名空间。
我在我的 symfony 应用程序中使用了一个 redis 缓存。
在检查 redis-cli
中内部使用的键时,我发现所有条目共享一个公共前缀(如 AWVAugkC6-:
或 gBphwvED1G:
)。如果我在 dev
和 prod
之间切换 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 使用相同的命名空间。