2009-07-06 50 views
1

我想從頭開發一個論壇,有特殊的需求和定製。從SQL表緩存計數的最佳方法?

我想準備我的密集使用論壇,想知道如何緩存諸如用戶帖子數和用戶回覆數等內容。

只有三個表,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 

不幸的是,這種方法是非常密集的CPU,我想看看你如何緩存表計數的東西的想法。

如果在插入/刪除時計算每個用戶的回覆並將其存儲在單獨的字段中,如何與手動更改數據同步。假設我將手動刪除SQL中的回覆。

回答

3

這是三個方法我會想着:

1)也許SQL Server的性能就足夠好,你不需要緩存。您可能低估了SQL Server如何完成其​​工作。如果你正確地進行了連接,只需要一個查詢即可獲得該線程中所有用戶的所有計數。如果你認爲這是每個用戶的一個查詢,那就錯了。

2)不要緩存。將用戶數冗餘存儲在用戶表中。每當帖子被插入或刪除時更新用戶行。 3)如果你有成千上萬的用戶,甚至有成千上萬,但不是數百萬,你可能會發現在web層的內存中緩存用戶和他們的計數是實用的 - 對ASP.NET來說,「應用程序」緩存是很實用的。

2

我不打擾緩存直到我肯定會需要這個。從我的觀點來看,這是無法預測需要緩存的地方的。嘗試迭代方法,儘量實現免費,然後統計數據,然後實施正確的緩存(有許多種類,如內容,數據,聚集,分佈等)。

順便說一句,我不認爲你的查詢是CPU消耗。 SQL服務器將optimaze東西和COUNT(*)將運行在滴答...

1

tbl前綴吸 - 多達Replies.aspx?id=x&page=y URIs做。考慮ASP.NET MVC或只是路由部分。

二,不要過早優化。但是,如果您確實需要這樣做,請將數據非規範化:將TotalReplies列添加到您的ForumTopics表中,並依靠DAL/BL使該字段保持最新(可能使用計劃任務重新同步)或使用觸發器。

1

對於每個回覆,您需要保留TotalRepliesTotalDirectReplies。這樣,您可以支持類似樹狀結構的回覆,並在整個層次結構中保持計數更新,而無需每次計數。