我想从头开发一个有特殊需求和定制的论坛。
我想准备我的论坛以供密集使用,并想知道如何缓存用户帖子数量和用户回复计数等内容。
只有三个表,tblForum,tblForumTopics,tblForumReplies,缓存用户主题和回复计数的最佳方法是什么?
在一个简单的场景中思考:用户按下一个链接并打开Replies.aspx?id = x& page = y页面,然后开始阅读回复。在HTTP请求上,服务器将运行一个SQL命令,它将获取该页面的所有回复,“内部加入tblForumReplies以查找每个回复用户的用户回复数。”
select
tblForumReplies.*,
tblFR.TotalReplies
from
tblForumReplies
inner join
(
select IdRepliedBy, count(*) as TotalReplies
from tblForumReplies
group by IdRepliedBy
) as tblFR
on tblFR.IdRepliedBy = tblForumReplies.IdRepliedBy
不幸的是,这种方法非常密集,我想看看你如何缓存像表计数这样的东西的想法。
如果在插入/删除时计算每个用户的回复,并将其存储在单独的字段中,如何与手动数据更改同步。假设我将手动删除SQL中的回复。
答案 0 :(得分:4)
这是我想到的三种方法:
1)也许SQL Server性能足够好,您不需要缓存。您可能低估了SQL Server可以完成其工作的程度。如果你正确地进行连接,那么只需要一个查询来获取该线程中所有用户的所有计数。如果您将此视为每个用户一个查询,那就错了。
2)不要缓存。冗余地将用户计数存储在用户表中。每当插入或删除帖子时,都要更新用户行。
3)如果您拥有数千个用户,甚至数千个用户,甚至数千个用户,您可能会发现将用户及其计数缓存在Web层的内存中是实用的 - 对于ASP.NET,即“应用程序”缓存。
答案 1 :(得分:2)
我不打扰缓存,直到我肯定会需要这个。从我的经验来看,这无法预测需要缓存的地方。尝试迭代方法,尝试实现无效的cashe,然后gether统计,然后实现正确的缓存(有很多种类,如内容,数据,聚合,分布式等)。
顺便说一句,我不认为您的查询是CPU消耗。 SQL服务器将优化那些东西,COUNT(*)将在ticks中运行......答案 2 :(得分:2)
tbl
前缀很糟糕 - 与Replies.aspx?id=x&page=y
URI一样多。考虑ASP.NET MVC或只是路由部分。
其次,不要过早优化。但是,如果您确实需要,请对数据进行非规范化:将TotalReplies
列添加到ForumTopics
表中,并依赖DAL / BL保持此字段为最新状态(可能需要重新同步计划任务)那些),或使用触发器。
答案 3 :(得分:1)
对于每个回复,您需要保留TotalReplies
和TotalDirectReplies
。这样,您可以支持树状结构的回复,并在整个层次结构中保持计数更新,而无需每次都计算。