stfalcon-studio / doctrine-redis-cache-bundle
为 doctrine 缓存池添加自定义命名空间。
Requires
- php: >=8.2
- ext-redis: *
- doctrine/doctrine-migrations-bundle: ^3.2
- symfony/cache: ^7.0
- symfony/config: ^7.0
- symfony/dependency-injection: ^7.0
- symfony/framework-bundle: ^7.0
- symfony/http-kernel: ^7.0
Requires (Dev)
- escapestudios/symfony2-coding-standard: ^3.12
- phpstan/phpstan: ^1.8.2
- phpstan/phpstan-doctrine: ^1.3
- phpstan/phpstan-phpunit: ^1.1
- phpstan/phpstan-symfony: ^1.2
- phpunit/phpunit: ^9.5
README
📦 为 doctrine 缓存池添加自定义命名空间。
此包解决的问题
当您使用 Redis 作为 Doctrine 查询/元数据/二级 缓存的提供者时,Doctrine 为每个缓存项生成唯一的键。当您更改数据库模式时,创建一个新的迁移(Doctrine 迁移),然后将其部署到生产环境,您必须在部署后清理 Doctrine 缓存。Doctrine 有清理任何类型缓存的控制台命令,并且它们运行良好。但是,如果在缓存刷新期间您已经运行了脚本(长时间运行的控制台/cron 任务或消费者),它仍然会使用旧的方案信息,这可能会与您的新的方案冲突。在这种情况下,此脚本可以重新生成缓存(因为它已经被刷新),使用旧的方案元数据、查询、结果等。
为防止此问题,我们为每个选定的缓存池添加一个自定义的 命名空间。此 命名空间 是最新迁移版本的名称。例如,您将项目的第一个版本部署到生产环境。最新的迁移版本是 1
,因此缓存中的所有键都将有前缀 [1]
(例如,[1]hash_by_doctrine
)。然后您修改您的方案,生成一个新的迁移(版本 2
),并将其部署到生产环境。旧的运行脚本仍然会使用并生成前缀为 [1]
的键,但新的脚本将开始使用新的前缀 [2]
,不会与先前的前缀冲突。
之后,您可以停止或重新运行旧脚本。重新运行后,它们将使用新的前缀,您可以使用先前的前缀清理缓存条目。
安装
composer req stfalcon-studio/doctrine-redis-cache-bundle
检查 config/bundles.php
文件
默认情况下,Symfony Flex 会将此包添加到 config/bundles.php
文件。但是在您在包安装时忽略了 contrib-recipe
的情况下,它不会被添加。在这种情况下,请手动添加包。
# config/bundles.php return [ // Other bundles... StfalconStudio\DoctrineRedisCacheBundle\StfalconStudioDoctrineRedisCacheBundle::class => ['all' => true], // Other bundles... ];
可能的缓存池配置示例
framework: cache: default_redis_provider: snc_redis.default pools: doctrine.result_cache_pool: adapter: cache.adapter.redis provider: snc_redis.doctrine_result_cache doctrine.metadata_cache_pool: adapter: cache.adapter.redis provider: snc_redis.doctrine_metadata_cache doctrine.query_cache_pool: adapter: cache.adapter.redis provider: snc_redis.doctrine_query_cache
包配置
stfalcon_studio_doctrine_redis_cache: cache_pools: - 'doctrine.query_cache_pool' - 'doctrine.metadata_cache_pool' - 'doctrine.result_cache_pool'
贡献
阅读 CONTRIBUTING 文件。