2016-05-18 1 views
2

J'ai configuré le cache de deuxième niveau READ_WRITE pour mon entité en utilisant Redis.Doctrine: cache de second niveau

Pourquoi le cache n'est pas invalide pour la requête lorsque j'insère une nouvelle entité, mais il est invalide lorsque je mets à jour ou efface une entité. Par exemple.

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

Dans ce cas, il cache invalide:

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

Mais dans ce cas, il ne veut pas invalider

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

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

Qu'est-ce qui ne va pas?

Répondre

0

Votre deuxième requête est une recherche sur l'entité spécifique avec un ID spécifique. Lors de la mise à jour/suppression de votre entité via Doctrine, il sait qu'il peut y avoir quelque chose dans le cache (parce que vous l'avez configuré sur l'entité elle-même) et le supprime (probablement en utilisant un écouteur postFlush). Donc, Doctrine a géré l'invalidation du cache pour vous dans le second cas.

Dans votre première requête, Doctrine n'a aucune idée du cache lors de la mise à jour/suppression, car le cache n'est configuré que sur QueryBuilder lors de la sélection. Vous aurez probablement besoin d'écrire votre propre invalidator cache (probablement un écouteur postFlush dans la doctrine ou quelque chose de similaire). Pour autoriser l'invalidation en fonction de la clé, vous pouvez appeler le setResultCacheId pour utiliser une clé spécifique dont vous aurez besoin ultérieurement pour l'invalider.