gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:14:36 26 4
gpt4 key购买 nike

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

当检查 redis-cli 中内部使用的键时,我发现所有条目共享一个公共(public)前缀(如 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 ,但我认为这一行应该只是散列给定的 key ,而不是环境...?

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

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

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

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

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

关于Symfony RedisAdapter 根据应用程序环境有不同的内部缓存键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55271509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com