在业务层缓存与在数据层缓存


36

我一直在使用DAL进行缓存的项目中工作,基本上只是在您要对数据库进行调用时,它会检查缓存中是否已经有数据,如果存在,它不会进行调用,并且而是返回该数据。

我最近才读到有关在业务层进行缓存的信息,因此基本上可以缓存整个业务对象。我可以立即看到的一个优势是响应时间更快。

您什么时候比另一个更喜欢?并且在业务层缓存是一种常见的做法吗?


您的应用程序的性能是否如此关键,以至于在业务层进行缓存而不是避免对存储库或DAL层进行额外调用的清晰性可取?
JDT 2015年

1
不,不是。阅读回复后,我认为我会坚持仅在DAL中进行缓存。干杯。
艾玛(Emma)

您应该考虑在业务层之上进行缓存,并考虑扩展。
AK_ 2015年

Answers:


30

对于确定的答案,这可能太宽泛了。就我个人而言,我认为数据访问层是缓存的最佳场所,仅因为它应该非常简单-记录可以进出,仅此而已。

业务层实现了许多其他复杂性更高的规则,因此最好不要在同一类(甚至同一方法)中除了管理多对象一致性问题外,不必管理每个对象的可用性问题。公然违反SRP。

(当然,当我的服务类尝试同时进行缓存和配置时,我的服务类变得越来越难以控制,我只有在获得了深刻见解之后,再没有比经验更好的老师了,但是价格肯定很高。)


为什么缓存需要很复杂?可以使用AOP和几个注释来完成。是否仍然违反SRP?为什么不在DAL中完成?恕我直言,我从未见过要缓存的服务类“太复杂”;与服务的复杂性无关,服务可以被视为黑匣子,并且可以缓存其结果
user1075613

25

数据访问和持久性/存储层是不可抗拒的自然缓存地方。他们在做I / O,使它们成为方便,容易插入缓存的地方。我敢说,几乎每个DAL或持久层都将随着其成熟而被赋予缓存功能-如果从一开始就不是那样设计的。

问题是故意的。DAL和持久层处理相对较低级别的构造,例如记录,表,行和块。他们看不到“业务”或应用程序层对象,也没有深入了解如何在更高级别使用它们。当他们看到要读取或写入的几行或十几个块时,不清楚它们代表什么。“我们目前正在分析的Jones帐户”与“该应用仅需要一次且不会再次引用的一些基本税率参考数据”看起来并没有太大不同。在这一层,数据就是数据就是数据。

在DAL /持久层进行缓存的风险在于,有“冷”税收参考数据位于那里,毫无意义地占用了12.2MB的缓存,并且替换了一些帐户信息,而事实上,这些信息将在短短一分钟内被大量使用。即使是最好的高速缓存管理器,也很少处理高级数据结构和连接的知识,对即将到来的操作知之甚少,因此他们只能依靠猜测算法

相比之下,应用程序或业务层缓存并不是那么整洁。它要求在其他业务逻辑中间插入缓存管理操作或提示,这会使业务代码更加复杂。但是要权衡一下:了解更多有关宏级数据的结构和即将进行的操作的知识,它有更好的机会来近似最佳(“千里眼”或“贝拉迪·敏”)缓存效率。

将缓存管理职责插入业务/应用程序代码是否有意义是一个判断调用,并且会因应用程序而异。在许多情况下,虽然已知DAL /持久层不能做到“完全正确”,但要权衡的是它们可以做得很好,它们可以在架构上“干净”并且可以进行更深入的测试,并且这种低级别的捕获避免了增加业务/应用程序代码的复杂性。

较低的复杂度可提高准确性和可靠性,并加快产品上市时间。通常认为这是一个很好的折衷方案-不太完善的缓存,但是质量更高,更及时的业务代码。


谢谢回复。阅读您和其他人的答复后,我认为我绝对不需要缓存在业务层中。这只会增加产品的整体复杂性。
艾玛(Emma)

1
“层”模型的一个问题是有效的缓存机制通常需要使用在单个层上不可用的信息。但是,您如何看待业务层将有关其总体“计划”的“提示”传递给数据层?数据层最初可能会忽略大多数此类提示,但是如果发现瓶颈,则可以添加一些逻辑,当给出某些提示时,这些逻辑将以业务特定的方式更改缓存策略。
2015年

1
很棒的一点,@ supercat。我本来要提到提示/实用策略,但是答案早已存在。但是你是完全正确的。业务层向下层提示如何确定缓存的优先级或“固定内容”,这是获得高层缓存而不使业务代码全部完成或过于忙于管理自己的存储的一种常见/有用的方法。层次结构。
乔纳森·尤尼斯

@JonathanEunice:关于提示的一件好事是,代码最初不需要对它们做任何事情。许多系统在性能上都有一些明显的瓶颈,但是可能很难预测哪个系统是否足够糟糕。在一些关键位置添加少量难看的缓存逻辑可能比在无关紧要的地方添加大量缓存逻辑更好。
2015年

1
究竟。尤其是如果您在持久性/访问层已经具有“相当不错”的低级缓存。您可能只需要一点点添加的优先级信息即可从“非常好”变为“非常好”。
乔纳森·尤尼斯

16

DAL上的缓存既简单又简单

您的DAL是中央数据访问层,这意味着可以通过那里的类来控制任何数据访问。由于读取和持久化都发生在这些层上,因此随着更改的发生,清除或更新缓存条目同样容易。

业务缓存非常灵活

对业务进行缓存使开发人员可以灵活地确定对象的具体用法是否将从缓存中受益。根据应用程序的结构,后端服务或自动化过程可能会更改其他部分中缓存的数据。通过缓存业务,开发人员可以确定某个业务对象是否将具有过时的数据并获得性能,或者以牺牲性能为代价来确定业务对象的最新状态。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.