现在花了几天时间弄清楚为什么我的二级缓存配置为学说不起作用,我希望有人能够支持。 目前没有二级缓存调用导致命中。
我的项目目前使用以下软件包进行设置(+其他一些可能与此设置无关的软件包):
"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 Cache"只记录未命中和投注,而不是命中:
在调试期间,我发现在Doctrine / ORM / Query的缓存请求中尝试访问ArrayCache而不是配置的缓存驱动程序。
如果某人有二级缓存的工作示例配置,它可能已经有所帮助,因为它既不适用于我的Redis,也不适用于APCu或memcached。
我希望有人有想法,或者只是分享他的工作配置。
提前致谢&最好的问候
答案 0 :(得分:6)
好的,所以大约一个月后我终于得到了答案!
请注意,Doctrine本身支持许多缓存驱动程序,包括redis,但在我的情况下,也可能在OP的情况下,我需要使用SncRedisBundle才能利用Redis Master-Slave复制和/或聚类。
我在这里得到了有关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二级缓存的集成支持
答案 1 :(得分:2)
您还需要为二级缓存启用正确的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
结合使用的示例。