如何在Symfony上正确缓存Doctrine 2查询?

时间:2018-08-12 07:27:17

标签: php symfony caching doctrine-orm doctrine

我已经广泛阅读了有关教义的各种不同的缓存选项以及symfony缓存机制:

Symfony官方:https://symfony.com/doc/4.0/components/cache.html

博士官员:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/caching.html

KnP大学(一如既往的有用):https://knpuniversity.com/screencast/symfony-fundamentals/caching

我应该使用Doctrine缓存还是Symfony 4缓存?选择哪一个?

我想从数据库中提取大量要缓存的数据(拉动带有大量左联接的实体),这些左联接有时每小时,每天或每分钟更新一次定期通过带有cron作业(symfony命令)的机器人来调用。

data.csv

考虑到频繁的更新,我不确定如何正确地缓存此查询。

谢谢

1 个答案:

答案 0 :(得分:1)

Doctrine有几种类型的缓存:

  1. 用于类元数据(用于存储到数据库的类映射)
  2. 用于查询(存储已解析的DQL查询的位置)
  3. 用于查询结果(存储查询获取的实际结果的位置)

前两种类型的Doctrine缓存与您的问题无关,因为它们专用于Doctrine,在Symfony中没有直接替代方法。查询结果缓存可以(间接)替换为Symfony缓存。

查询结果缓存的使用以及有关使用哪个缓存的决定应取决于应用程序的逻辑。如果满足以下条件,您可以选择使用Doctrine查询结果缓存:

  1. 您需要存储从数据库中获取的原始数据(这意味着在将其存储到缓存之前不需要进一步处理)
  2. 您的查询结果可以在特定时间段内存储在缓存中,并且在这段时间内不太可能过时

在这种情况下,Doctrine查询结果缓存可能对您有用,因为它对您的应用程序是透明的。它可能仅对某些查询有用,因为您可以在每个查询的基础上控制Doctrine缓存的使用和生存期。

在某种情况下,如果您需要对从数据库中获取的结果进行进一步处理,然后再将其存储在缓存中,或者您可以应用一些其他逻辑来确定缓存内容是否过时-最好使用Symfony缓存,因为特定于您的应用程序,并且可以由您控制。