在使用 doctrine、dql 和 SQL 的项目中使用 doctrine 缓存是否安全
Is it safe to use doctrine cache in a project using doctrine, dql and SQL
我正在处理一个原则缓存未激活的项目。我们遇到了一些性能问题,我想知道激活教义缓存是否会导致可能的回归。
这就是我问这个问题的原因:
我可视化了3种缓存类型:
- metadata_cache_driver
- result_cache_driver
- query_cache_driver
对我来说最重要的是 result_cache_driver。而且我不确定它是如何工作的。这是我的想象:
我们有一个实体 "book"。如果我们创建一个 dql 查询,或使用 findBy doctrine 方法来获取 1975 年写的所有书籍,它将 return 让我们说 75 本书。此结果存储在缓存中,下次调用它时,它不会请求数据库而是从缓存中获取结果。
现在我们用 DQL 或学说更新实体($book->setYear(1976))。我想实体书的缓存将被重置,下次我们请求 1976 年写的所有书时,它将 return 74 本书。
但是,如果我们使用 SQL 更新数据库会怎样:UPDATE book set year = 1976 where id = XXX.当我们请求 1975 年写的所有书籍时,它会清除该实体的缓存并请求数据库吗?或者它仍然会使用缓存的结果和 return 我们更新的书,它不再是 1975 年的了?
总而言之,有 3 种方法可以更新我们的数据库:
- 使用学说实体(针对单个更新)
- 使用 dql 查询
- 使用 sql 查询(用于批量更新)
那么学说缓存结果是否考虑了这三种方式?或者会不会有一些情况我们必须等待缓存寿命结束才能获得新的正确结果?
如您所说,缓存分为三种,它们对您的应用程序性能非常有用。
查询缓存: 多次执行此解析没有意义,因为它不会更改,除非您更改 DQL 查询。所以,是的,使用查询缓存是有意义的,尤其是在生产环境中,它缓存 DQL 查询到其 SQL 对应项的转换。例如,除了用户实现的搜索外,我缓存所有查询以避免转换过程并提高性能。
元数据缓存 您的 class 元数据可以从几个不同的来源解析,例如 YAML、XML、注释等。而不是解析此信息对于每个请求,我们应该使用其中一个缓存驱动程序来缓存它。在生产环境中,您的 class 元数据不会改变。那么为什么不让元数据缓存发挥作用呢?
Result Cache result cache可以用来缓存你查询的结果,这样我们就不用再去查询数据库或者第一次hydrate数据了.可以避免水合过程。您只需要配置结果缓存实现。
如果您的应用程序中有一些资源从未改变(国家列表、城市列表),您应该使用它们并设置较长的缓存生命周期以获得大量性能。
如果你有经常变化的数据,你可以避免缓存,但我认为 doctrine 缓存仍然有用。例如,如果您在代码中调用用户三次(一次测试访问令牌,一次测试安全性,最后一次设置其最后一个 activity),学说结果缓存将避免两次sql 和两次补水。
如果您的数据只有在管理员更新设置时才会更改(您在线商店销售的商品的描述),您应该缓存它们。当管理员更新它们时,您清除缓存。
可以通过验收测试来评估性能。 (看看 Codeception)您可以在您的资格平台上安装您的应用程序并清除和预热缓存。然后你启动测试 with/without 缓存,你可以比较执行时间。
我正在处理一个原则缓存未激活的项目。我们遇到了一些性能问题,我想知道激活教义缓存是否会导致可能的回归。
这就是我问这个问题的原因:
我可视化了3种缓存类型:
- metadata_cache_driver
- result_cache_driver
- query_cache_driver
对我来说最重要的是 result_cache_driver。而且我不确定它是如何工作的。这是我的想象:
我们有一个实体 "book"。如果我们创建一个 dql 查询,或使用 findBy doctrine 方法来获取 1975 年写的所有书籍,它将 return 让我们说 75 本书。此结果存储在缓存中,下次调用它时,它不会请求数据库而是从缓存中获取结果。
现在我们用 DQL 或学说更新实体($book->setYear(1976))。我想实体书的缓存将被重置,下次我们请求 1976 年写的所有书时,它将 return 74 本书。
但是,如果我们使用 SQL 更新数据库会怎样:UPDATE book set year = 1976 where id = XXX.当我们请求 1975 年写的所有书籍时,它会清除该实体的缓存并请求数据库吗?或者它仍然会使用缓存的结果和 return 我们更新的书,它不再是 1975 年的了?
总而言之,有 3 种方法可以更新我们的数据库:
- 使用学说实体(针对单个更新)
- 使用 dql 查询
- 使用 sql 查询(用于批量更新)
那么学说缓存结果是否考虑了这三种方式?或者会不会有一些情况我们必须等待缓存寿命结束才能获得新的正确结果?
如您所说,缓存分为三种,它们对您的应用程序性能非常有用。
查询缓存: 多次执行此解析没有意义,因为它不会更改,除非您更改 DQL 查询。所以,是的,使用查询缓存是有意义的,尤其是在生产环境中,它缓存 DQL 查询到其 SQL 对应项的转换。例如,除了用户实现的搜索外,我缓存所有查询以避免转换过程并提高性能。
元数据缓存 您的 class 元数据可以从几个不同的来源解析,例如 YAML、XML、注释等。而不是解析此信息对于每个请求,我们应该使用其中一个缓存驱动程序来缓存它。在生产环境中,您的 class 元数据不会改变。那么为什么不让元数据缓存发挥作用呢?
Result Cache result cache可以用来缓存你查询的结果,这样我们就不用再去查询数据库或者第一次hydrate数据了.可以避免水合过程。您只需要配置结果缓存实现。 如果您的应用程序中有一些资源从未改变(国家列表、城市列表),您应该使用它们并设置较长的缓存生命周期以获得大量性能。
如果你有经常变化的数据,你可以避免缓存,但我认为 doctrine 缓存仍然有用。例如,如果您在代码中调用用户三次(一次测试访问令牌,一次测试安全性,最后一次设置其最后一个 activity),学说结果缓存将避免两次sql 和两次补水。
如果您的数据只有在管理员更新设置时才会更改(您在线商店销售的商品的描述),您应该缓存它们。当管理员更新它们时,您清除缓存。
可以通过验收测试来评估性能。 (看看 Codeception)您可以在您的资格平台上安装您的应用程序并清除和预热缓存。然后你启动测试 with/without 缓存,你可以比较执行时间。