查询数据的缓存策略

TWi*_*ars 10 sql database caching

我目前正在构建一个DB密集型项目的存储库(已经执行了性能测试,需要缓存,因此我要问)

我现在设置它的方式是每个对象都是单独缓存的,如果我想对它们进行查询,我将查询传递给数据库并返回所需的id.(对于一些简单的查询,我已经缓存并管理了ID)

然后我用这些ID命中缓存并将它们拉出来,任何丢失的对象都捆绑到"where in"语句并向数据库发送; 此时,我用缺少的id重新填充缓存.

他们自己的查询最有可能是分页/排序数据.

这是一个合适的策略吗?或者是否有更好的技术?

ale*_*emb 9

这是一种合理的方法,我之前已经走过这条路线,最好将它用于简单的缓存.

但是,当您更新或写入数据库时​​,您将遇到一些有趣的问题,您应该仔细处理这些情况.

例如,如果用户更新数据库中的记录,则缓存数据将过时.在这种情况下,您将需要同时更新内存缓存或清除缓存,以便可以在下一个获取查询时刷新缓存.

如果您例如用户更新客户的电子邮件地址,该电子邮件地址位于单独的表中但通过外键关联,则事情也会变得棘手.

除了数据库缓存,您还应该考虑输出缓存.例如,如果您有一个显示上个月销售数据的表格,则此方法非常有效.该表可以存储在另一个文件中,该文件包含在一堆想要显示该表的其他页面中.现在,如果您使用销售数据表缓存该文件,那些其他页面在请求此文件时,缓存引擎可以直接从磁盘获取它,并且业务逻辑层甚至不会被命中.这不是一直适用,但对自定义控件非常有用.

工作单位模式

它还有助于了解工作单元模式.

当您将数据导入和导出数据库时,跟踪您已更改的内容非常重要; 否则,该数据将不会被写回数据库.同样,您必须插入您创建的新对象并删除您删除的任何对象.

您可以在每次更改对象模型时更改数据库,但这会导致大量非常小的数据库调用,最终会非常慢.此外,它要求您为整个交互打开一个事务,如果您有一个跨越多个请求的业务事务,这是不切实际的.如果您需要跟踪已读取的对象,情况会更糟,这样可以避免读取不一致.

工作单元会跟踪您在业务事务中可能影响数据库的所有操作.完成后,它会计算出因工作而需要更改数据库的所有操作.