启用了Symfony 2二级缓存但未使用?

时间:2017-06-04 12:58:07

标签: php symfony caching doctrine-orm

我有至少有一个相关实体的记录列表。在记录列表中,我显示相关记录中的主列表和数据,因此如果表有~100条记录,则生成并执行约150个查询:一个用于列表,一个用于每个相关实体,这不是很好的事情。它可以很容易地简化为2个查询:一个用于列表,一个用于所有相关实体。

正如我发现的那样,学说中的二级缓存对于这种情况来说是完美的。

所以,我在config中启用了缓存:

doctrine:
  orm:
    second_level_cache:
      enabled: true

并添加到所有实体注释@ORM\Cache(usage="READ_ONLY")。然后在生成列表之前,我从两个表中获取所有记录:

$this->getDoctrine()->getRepository('AppBundle:Refuel')->findAll();
$this->getDoctrine()->getRepository('AppBundle:FuelType')->findAll();

正如我所希望的那样,它们将被缓存并在实际列表渲染中重复使用,而不会产生约150个查询。但事实并非如此。调试面板显示仍然执行约150个查询,缓存统计信息为:

Hits: 0
Misses: 2
Puts: 319

因为我猜实体正被缓存但没有被重用。为什么呢?

所有我发现的二级缓存都与redis有关 - 不想使用它 - 使用该缓存需要redis吗?

令人遗憾的是,关于如何配置它的文档很少。

1 个答案:

答案 0 :(得分:3)

只是为了扩展@BDS和@ Jakub的评论,谁有正确的答案,如果你只做一件事应该是将你的查询改为急切加载(注意我们在查询中选择两种实体类型所以所有记录将一次性获取):

$refuel= $this->m_em
        ->getRepository('AppBundle:Refuel')
        ->createQueryBuilder('r')
        ->select('r,t')
        ->join('r.fuel_type', 't')
        ->getQuery()
        ->getResult();

完成后,您可以开始考虑使用二级缓存。为此,您需要在config [_prod] .yml:

中指定缓存驱动程序
second_level_cache:
  region_cache_driver:
    type: memcache
  enabled: true
  log_enabled: false
  regions:
    my_region:
      cache_driver: memcache
      lifetime: 3600

然后向您的可缓存实体添加注释:

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 * @ORM\Cache(usage="NONSTRICT_READ_WRITE", region="my_region")
 */