2016-05-18 6 views
2

Я настроил второй уровень READ_WRITE кеш для моего объекта, используя Redis.Доктрина: кеш второго уровня

Почему кэш не делает недействительным запрос при вставке нового объекта, но он недействителен при обновлении или удалении объекта. Например.

$this 
    ->getDoctrine() 
    ->getManager() 
    ->getRepository('AppBundle:Test') 
    ->createQueryBuilder('s') 
    ->select('s') 
    ->getQuery() 
    ->setCacheable(true) 
    ->getResult(); // this is my query. 

В этом случае аннулирует кэш:

$a = $this 
    ->getDoctrine() 
    ->getManager() 
    ->getRepository("AppBundle:Test") 
    ->find(119); 
$a->setName("new value"); 
$a->setType("new value"); 

Но в этом случае он не хочет аннулировать

$a = new Test(); 
$a->setName('fg'); 
$a->setType('bbbb'); 

$this->getDoctrine()->getManager()->persist($a); 
$this->getDoctrine()->getManager()->flush(); 

Что случилось?

ответ

0

Ваш второй запрос - это поиск на конкретном объекте с определенным идентификатором. Когда вы обновляете/удаляете свой объект через Doctrine, он знает, что в кеше может быть что-то (потому что вы настроили его на самом объекте) и удаляет его (возможно, с помощью прослушивателя postFlush).

Итак, Doctrine управляет недействительностью кэш для вас во втором случае.

В вашем первом запросе Doctrine не знает о кеше при обновлении/удалении, поскольку кеш настроен только на QueryBuilder при выборе. Возможно, вам понадобится написать свой собственный недействительный кеш (возможно, слушатель postFlush в доктрине или что-то подобное). Чтобы разрешить недействительность на основе ключа, вы можете позвонить setResultCacheId, чтобы использовать конкретный ключ, который вам позже понадобится для недействительности.

Смежные вопросы