2010-09-27 50 views
4

我有一個Web應用程序,我需要跟蹤「最受歡迎」(訪問量最高)的文章。該應用程序中的大多數頁面(包括文章頁面)在側邊欄中顯示「最受歡迎」列表,因此該列表將經常被檢索。另一方面,文章也經常被訪問(大約1/2頁訪問是對文章頁面的訪問)。按值快速增加值操作的併發映射

跟蹤訪問並能夠選擇N次訪問最多的文章的最佳方式是什麼?據我所知,它應該是一個併發地圖articleId-> visitCount,它是按值(visitCounts)排序的,我可以快速(並且有線地)增加visitCount並期望地圖重新排序。

回答

2

對於Web應用程序來說,存儲它的最佳位置應該放在數據庫中。使用文章ID字段和訪問次數字段創建數據庫。根據訪問次數索引表格。每當查看文章時,添加記錄或增加現有記錄。當你需要查看最受歡迎的列表時,只需查詢表格即可。

數據庫通常是將數據存儲在Web應用程序中的最佳答案。

在這種情況下,數據庫將根據訪問次數索引表。這使得插入和更新有點慢,但是數據庫被設計來完成這項工作,所以它不會太壞。由於維護的索引,檢索這些數據總是非常快。

1

如果您不想使用數據庫,則可以使用SortedSet來存儲包含文章ID和訪問計數的對象。對象的比較將在訪問計數上。實現可能包括TreeSet,它必須在多線程環境中進行外部同步,並且ConcurrentSkipListSet不需要在外部進行同步。

+0

大多數SortedSet元素的比較不是傳遞的實例(由於被比較的對象發生變化)會導致一些奇怪的bug。你將如何處理a> b> a的情況? – 2010-09-28 05:25:41

+0

是否要刪除並重新添加每個更新的條目? – Fixpoint 2010-09-28 06:47:22

+0

@Shooshpanchick顯然;否則,它將無法工作。 – 2010-09-28 18:12:57

0

就我個人而言,我不會在更新過程中嘗試回答這個問題。每次訪問更新結構的可能性要大於閱讀結果。

當需要閱讀時,複製每個ID,訪問#條目,然後對其進行排序以便顯示。你會驚訝它是多麼便宜。

+0

可能有超過一百萬篇文章,因此不幸的是,每次排序它們都不是一種選擇。 – Fixpoint 2010-09-28 06:45:54