2010-11-21 47 views
1

我想問一個關於使用SQL數據庫的高負載Web應用程序開發方法的問題。 假設我們有簡單的CMS系統提供對不同文章的訪問。我們也想將商品訪問量存儲在數據庫中。每次用戶觀看文章時,此訪問計數器都會增加。使用SQL數據庫的高負載Web項目

就SQL數據庫而言,我們在每次訪問文章時都需要增加表格「文章」中的「訪問」整數字段。如果文章有大量的併發訪問,則需要正確修改當前數據庫行的「訪問」字段值。

我使用悲觀鎖定方法:「SELECT .. FOR UPDATE」。每次用戶訪問某篇文章時,我都會鎖定「文章」表中的特定行,並增加「訪問次數」計數器。

這種方法是否正確?

我在我的項目中使用MySQL數據庫。

回答

2

該方法適用於中等負載的網站,但最終會導致鎖定問題。

在負載很高的網站上,您希望實現消息隊列,並將「已訪問」事件發送到隊列。

脫機進程將讀取隊列並適當地更新列。這將允許任何時候只有一個進程訪問該特定列。

+0

能否請您指定您的負載範圍的數字?這將是偉大的,你的 – benjamin 2011-03-04 22:55:16

2

我絕對不會建議在文章數據中存儲彙總數據(如「訪問次數」),而應使用單獨的表格在每次訪問時記錄一條新記錄。將時間戳,article_id,IP地址和其他數據存儲在那裏。 這背後的基本原理是,您不必爲每次訪問鎖定每篇文章的數據庫記錄,這可能會導致鎖定問題/爭用。

現在,當您有興趣檢索視圖數時,請在日誌表上做一個簡單的選擇。對於應該「足夠好」的中型網站;隨着負載的增加,您必須定期計算每篇文章的視圖數量,並緩存視圖計數器以加快訪問此數據的速度。

+0

正如FlySwat寫道,日誌訪問的文章也可以通過寫入隊列,然後批量處理更新。這仍然有缺點,即每當發生視圖時,都需要更新文章表(並因此鎖定文章記錄)。 – mhanisch 2010-11-22 17:44:22