带 Redis 的 Doctrine 二级缓存
Doctrine Second Level Cache w/ Redis
在花了几天时间弄清楚为什么我的学说二级缓存配置不起作用之后,我希望有人能够支持。
目前没有二级缓存调用导致命中。
我的项目目前设置了以下包(+ 一些可能与此设置无关的其他包):
"symfony/symfony": "2.6.*",
"doctrine/orm": "2.*",
"doctrine/dbal": "2.*",
"doctrine/doctrine-bundle": "~1.2"
...
"snc/redis-bundle": "1.*"
Doctrine缓存设置如下:
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
metadata_cache_driver: redis
query_cache_driver: redis
result_cache_driver: redis
second_level_cache:
enabled: true
log_enabled: true
元数据和查询缓存似乎工作正常,因为在 Redis 中创建了键,SNC Redis Bundle 也正确记录了我的缓存命中。但是“2l 缓存”只记录未命中和放置,而不是命中:
在调试过程中,我发现来自 Doctrine/ORM/Query 的缓存请求尝试访问 ArrayCache 而不是配置的缓存驱动程序。
如果有人有二级缓存的工作示例配置,它可能已经有所帮助,因为它对我来说既不适用于 Redis,也不适用于 APCu 或 memcached。
我希望有人有想法或者可以分享他的工作配置。
在此先致谢并致以最诚挚的问候
您还需要为二级缓存启用正确的cache_driver
:
second_level_cache:
region_cache_driver:
type: service
id: doctrine_cache.providers.second_level
enabled: true
regions:
region_name:
cache_driver:
type: service
id: doctrine_cache.providers.second_level
这是结合 DoctrineCacheBundle
的示例。
好的,大约一个月后我终于得到了答案!
请注意,Doctrine 本机支持许多缓存驱动程序,包括 redis,但在我的情况下,可能在 OP 的情况下,我需要使其与 SncRedisBundle 一起工作,以便利用 Redis Master-Slave复制 and/or 集群。
我在 Github 此处 https://github.com/snc/SncRedisBundle/issues/216
得到了我的答案和有用的反馈
基本上,您必须在 services.yml
中创建一个基本上是几行代码的服务
....
services:
snc_second_level_cache:
class: %snc_redis.doctrine_cache.class%
calls:
- ["setRedis", ["@snc_redis.cache"]]
- ["setNamespace", ["DoctrineSecondLevelCache"]] #Optional
....
然后在你的 config.yml
....
orm:
entity_managers:
default:
second_level_cache:
region_cache_driver:
type: service
id: snc_second_level_cache
enabled: true
....
就是这样,尽情享受吧!
更新 - 2016 年 1 月 19 日
截至今天,SncRedisBundle dev-master 分支现已兼容并集成了对 Doctrine 二级缓存的支持
在花了几天时间弄清楚为什么我的学说二级缓存配置不起作用之后,我希望有人能够支持。 目前没有二级缓存调用导致命中。
我的项目目前设置了以下包(+ 一些可能与此设置无关的其他包):
"symfony/symfony": "2.6.*",
"doctrine/orm": "2.*",
"doctrine/dbal": "2.*",
"doctrine/doctrine-bundle": "~1.2"
...
"snc/redis-bundle": "1.*"
Doctrine缓存设置如下:
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
metadata_cache_driver: redis
query_cache_driver: redis
result_cache_driver: redis
second_level_cache:
enabled: true
log_enabled: true
元数据和查询缓存似乎工作正常,因为在 Redis 中创建了键,SNC Redis Bundle 也正确记录了我的缓存命中。但是“2l 缓存”只记录未命中和放置,而不是命中:
在调试过程中,我发现来自 Doctrine/ORM/Query 的缓存请求尝试访问 ArrayCache 而不是配置的缓存驱动程序。
如果有人有二级缓存的工作示例配置,它可能已经有所帮助,因为它对我来说既不适用于 Redis,也不适用于 APCu 或 memcached。
我希望有人有想法或者可以分享他的工作配置。
在此先致谢并致以最诚挚的问候
您还需要为二级缓存启用正确的cache_driver
:
second_level_cache:
region_cache_driver:
type: service
id: doctrine_cache.providers.second_level
enabled: true
regions:
region_name:
cache_driver:
type: service
id: doctrine_cache.providers.second_level
这是结合 DoctrineCacheBundle
的示例。
好的,大约一个月后我终于得到了答案!
请注意,Doctrine 本机支持许多缓存驱动程序,包括 redis,但在我的情况下,可能在 OP 的情况下,我需要使其与 SncRedisBundle 一起工作,以便利用 Redis Master-Slave复制 and/or 集群。
我在 Github 此处 https://github.com/snc/SncRedisBundle/issues/216
得到了我的答案和有用的反馈基本上,您必须在 services.yml
中创建一个基本上是几行代码的服务....
services:
snc_second_level_cache:
class: %snc_redis.doctrine_cache.class%
calls:
- ["setRedis", ["@snc_redis.cache"]]
- ["setNamespace", ["DoctrineSecondLevelCache"]] #Optional
....
然后在你的 config.yml
....
orm:
entity_managers:
default:
second_level_cache:
region_cache_driver:
type: service
id: snc_second_level_cache
enabled: true
....
就是这样,尽情享受吧!
更新 - 2016 年 1 月 19 日
截至今天,SncRedisBundle dev-master 分支现已兼容并集成了对 Doctrine 二级缓存的支持