我正在一个项目教义缓存处于非活动状态的项目中。我们正在遇到一些性能问题,我想知道激活原则缓存是否会导致可能的回归。
这就是为什么我要问这个问题:
我可以看到3种缓存类型:
对我来说最重要的是result_cache_driver。而且我不确定它是如何工作的。这是我的想象:
我们有一个实体“书”。如果我们创建dql查询,或使用findBy学说方法获取1975年编写的所有书籍,则将返回let说75本书。此结果存储在缓存中,下次我们调用它时,它不会请求数据库,但会从缓存中获取结果。
现在我们用DQL或学说($ book-> setYear(1976))更新实体。我想实体书的缓存将被重置,下次我们要求所有1976年写的书时,它将返回74本书。
如果我们使用SQL更新数据库,该怎么办:UPDATE图书集year = 1976,其中id = XXX。当我们索要1975年编写的所有书籍时,是否会清除该实体的缓存并请求DB?还是它仍将使用缓存的结果并返回我们的更新书籍,而该书籍已不再是1975年的?
总结一下,有3种更新数据库的方法:
那么学说缓存结果是否考虑了这三种方式?还是在某些情况下,我们必须等待缓存的时间结束才能获得新的正确结果?
正如您所说,存在三种缓存,它们对于提高应用程序的性能非常有用。
Query Cache:多次执行此解析没有意义,因为除非您更改DQL查询,否则它不会更改。因此,是的,特别是在生产环境中使用查询缓存是有意义的,生产环境将DQL查询的转换缓存到其SQL副本。例如,除了用户实现的搜索之外,我还缓存了所有查询,以避免转换过程并获得性能。
元数据缓存可以从几种不同的来源(例如YAML,XML,注释等)解析类元数据。除了在每个请求上解析此信息之外,我们还应该使用一种缓存驱动器来缓存它。
结果缓存结果缓存可用于缓存查询的结果,这样我们就不必在第一次后查询数据库或再次合并数据。可以避免水合过程。您只需要配置结果缓存实现。如果您的应用程序中有一些资源从未改变(国家列表,城市列表),则应该使用它们并设置较长的缓存生存期,以提高性能。
如果您的数据经常更改,则可以避免使用缓存,但是我认为原则缓存仍然有用。例如,如果您在代码中调用用户三次(一次要测试访问令牌,再一次测试安全性,最后一次设置其最后一个活动),则发生了什么情况,理论结果缓存将避免两个sql和两个混合操作。
[如果您的数据仅在管理员进行设置更新(在线商店中出售的商品的描述)时更改,则应将其缓存。当管理员更新它们时,您清除了缓存。
性能可以通过验收测试进行评估。 (看一下Codeception)