2016-05-13 56 views
1

因此,我們有兩個實體Doctrine2二級緩存只有ID工作,並沒有關聯

ProductBrand

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的觸發相反,這是確定。

但也有一些情況下,在我們不明白是怎麼回事

  1. 使用->find($id)命中緩存,並從 Redis的檢索我們的Brand,但使用->findOneBy(array('name' => 'foo'));不 從Redis的獲取,它會創建一個MySQL查詢,然後將兩個查詢和結果緩存起來,然後, 查詢,您可以從Redis獲得foo品牌。如果2lc緩存整個 實體,爲什麼不試圖找到name字段?在Redis中實際上是 !

  2. 使用$result->getProducts()使得一個MySQL 查詢,並緩存所得實體,是不是supossed是 已經在Redis的,因爲我們已經配置了呀? (與緩存在 YAML註釋到關聯映射)

回答

0

您正在使用Redis的,但它可能是另一個緩存引擎(或者是文件)。什麼是緩存是結果的序列化作爲鍵/值。它不使用Redis NoSQL系統來查詢redis中的結構化對象,如果它是你正在尋找的。

緩存中的內容是結果序列化的關鍵值,儘可能原子化。因此,在一個sql查詢中,您擁有所有主鍵,然後查詢的所有對象都將在緩存中單獨提取。因此,如果您更新品牌中的一個,則不需要使與其相關的所有緩存無效,而只需要包含其自身品牌的條目。

對於你品牌 - >產品它是一樣的,產品高速緩存條目是一個只包含產品ID的集合,第一次調用getProducts時會觸發查詢,第二次則不會。