因此,我們有兩個實體Doctrine2二級緩存只有ID工作,並沒有關聯
Product
和Brand
。
AppBundle\Entity\Brand:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
cache:
usage : READ_ONLY
region : region_products
oneToMany:
products:
targetEntity: AppBundle\Entity\Product
mappedBy: brand
cache:
usage : READ_ONLY
cascade: ["remove", "persist"]
orderBy: { 'name': 'ASC' }
AppBundle\Entity\Product:
type: entity
cache:
usage : READ_ONLY
region : region_products
id:
id:
type: integer
generator:
strategy: AUTO
manyToOne:
brand:
targetEntity: AppBundle\Entity\Brand
inversedBy: products
joinColumns:
brand_id:
referencedColumnName: id
cache:
usage : READ_ONLY
我們已經配置Doctrine2 2LC與Redis的
services:
snc_second_level_cache:
class: "%snc_redis.doctrine_cache_phpredis.class%"
calls:
- ["setRedis", ["@snc_redis.second_level_cache"]]
- ["setNamespace", ["slc_"]]
doctrine:
orm:
result_cache_driver: redis
metadata_cache_driver: redis
query_cache_driver: redis
second_level_cache:
region_cache_driver:
type: service
id: snc_second_level_cache
region_lock_lifetime: 60
log_enabled: true
region_lifetime: 300
enabled: true
regions:
region_products:
cache_driver:
type: service
id: snc_second_level_cache
lifetime: 300
我們想要做的是緩存每Brand
什麼,以及它的相關Product
,所以如果我們檢索緩存Brand
,它給了我們它的Product
太。
遵循Doctrine的文檔,我們結束了上面的配置和這個查詢。
$em = $this->get('doctrine.orm.entity_manager');
$result = $em->getRepository('AppBundle:Brand')->findAll();
這其實是把我們所有的品牌進入Redis的,如果我們再次進行查詢,沒有在MySQL,但Redis的觸發相反,這是確定。
但也有一些情況下,在我們不明白是怎麼回事
使用
->find($id)
命中緩存,並從 Redis的檢索我們的Brand
,但使用->findOneBy(array('name' => 'foo'));
不 從Redis的獲取,它會創建一個MySQL查詢,然後將兩個查詢和結果緩存起來,然後, 查詢,您可以從Redis獲得foo
品牌。如果2lc緩存整個 實體,爲什麼不試圖找到name
字段?在Redis中實際上是 !使用
$result->getProducts()
使得一個MySQL 查詢,並緩存所得實體,是不是supossed是 已經在Redis的,因爲我們已經配置了呀? (與緩存在 YAML註釋到關聯映射)