对象缓存与缓存数据库查询结果

时间:2014-10-03 19:19:46

标签: caching

问题主要与数据库端的缓存有关。比如说,我们进行了各种性能优化,包括查询调优,数据库分片,数据库反规范化等。我们仍然需要在数据库端有一个内存缓存。我们有2个缓存选项 - 缓存数据库查询结果与缓存数据库(OR)业务对象。

缓存像(用户,产品,地址)这样的对象与缓存查询返回的结果集的优缺点是什么?

1 个答案:

答案 0 :(得分:4)

根据我的经验,缓存应用程序对象与缓存原始查询结果相比具有相当大的优势。

如果您的应用程序已经使用DAO层构建,该层将业务逻辑与数据库访问分开,则可以使用缓存代理模式在DAO上添加一个小型缓存层(即提供实现的实体)非常容易DAO的相同接口,处理从缓存中的存储/检索,并在需要时委托数据库访问实际目标实体。

这种方法在应用程序的设计中引出了一系列关键考虑因素:

  • 数据库访问逻辑,缓存层和业务逻辑之间存在明确的职责分离

  • 缓存逻辑的所有细节(密钥生成,存储策略和到期管理)都封装在一个单独的实体中

  • 您可以选择启用缓存设施,例如:仅适用于某些方法/ DAO

  • DAO和缓存代理共享相同的接口,例如在运行时也很容易打开/关闭缓存

  • 您可以单独测试DAO和缓存代理

更实用,缓存应用程序对象意味着:

  • 存储或检索对象时,您只需支付一个序列化/反序列化开销,而在检索查询结果时仍需要构建对象

  • 您的对象的复杂性(几乎)无关紧要(例如,缓存代理忽略了DAO在2个不同的数据源上创建了3个单独查询的对象)

  • 在某些情况下生成缓存密钥可能会非常棘手,而散列查询字符串(您在缓存代理中不知道)则更容易

  • 缓存中的序列化对象(例如json字符串)也可以从其他应用程序中读取和使用(不合需要,但有时需要)

  • 您的数据库可能已经实现了复杂且快速的缓存查询机制,您可能需要根据需要进行调整,而不是在其上构建另一个层

您可以自己为DAO构建缓存层。如果您的应用程序已经基于Spring等框架,则缓存支持可能已经内置,您只需要设置正确的配置(尽管并不总是如您所愿那样灵活)。

最后,我不能说使用查询缓存对经过深思熟虑的对象缓存有特定的优势。然而,它应该让我想知道一个流行的框架,例如Hibernate,默认情况下禁用了查询缓存,并且需要在个别查询中有选择地启用它。