在CRUD应用程序中,如何有效地缓存统计数据以避免查询数据库

时间:2016-09-05 11:00:31

标签: javascript node.js mongodb design-patterns database

我有一个带有一些分层数据的基本CRUD应用程序,例如:

user - 有很多 - > topic - 有很多 - > post

我想缓存一些统计数据,例如主题中的帖子数量,因此可以快速显示给用户。但是我想避免查询数据库并使用相同的主题ID计算所有帖子(我使用 mongodb ,所以没有连接,但即使我使用关系数据库,问题也是一样的)。

在网络应用中解决此问题的典型模式是什么?

这就是我的想法:

解决方案1 ​​

将子元素的数量存储为父元素的属性。 ie User.numOfTopics将存储主题数,当发生CRUD事件时,更新父元素

if (new topic created) {
  user = find user object from DB
  ++usr.numOfTopics;
}

优点

1)。易于实施和理解

2)。准确

缺点

1)。每个添加/删除操作不仅会更新受影响的元素本身,还会更新其父元素,因此我的数据库操作数量增加了一倍。如果用户添加/删除很多,那么它的性能可能会比计算一次更糟。

2)。统计数据收集与正常的业务逻辑相结合。

解决方案2

动态构建统计信息的进程内缓存。当用户连接时,有一个单独的进程计算用户的统计信息,将结果存储在缓存中并从那里提供将来的请求。任何未来的CRUD操作都将更新进程内缓存。

优点

1)。统计信息收集与业务逻辑(排序)分开

2)。较少的数据库查询,这应该意味着更好的性能。

缺点

1)。缓存结果不会持久化,因此如果服务器重新启动,则必须重建缓存,这将在首次访问时产生长延迟。

2)。统计过程与主过程并行运行,因此结果受竞争条件的影响。

有没有更好的方法来处理这个问题,我搜索了类似的问题,但大多数都提到了像RoR和ASP.net这样的特定框架。我想知道一般设计模式,如果有一个,或者解决方案最适合node.js。

0 个答案:

没有答案