并发映射按值快速递增值操作排序

时间:2010-09-27 17:21:45

标签: java data-structures concurrency

我有一个网络应用程序,我需要跟踪“最受欢迎”(访问量最大)的文章。该应用程序中的大多数页面(包括文章页面)在侧栏中显示“最受欢迎”列表,因此将非常频繁地检索此列表。另一方面,文章也经常被访问(大约有一半的页面访问是访问文章页面)。

跟踪访问量并选择N个访问量最大的文章的最佳方式是什么?据我所知,它应该是一个并发的map articleId-> visitCount,它按值(visitCounts)排序,我可以快速(并且线程安全地)增加visitCount并期望map重新排序。

3 个答案:

答案 0 :(得分:2)

对于Web应用程序,存储它的最佳位置是数据库。创建一个数据库,其中包含文章ID字段和访问次数字段。按访问次数对表格编制索引。每当查看文章时,添加记录或增加现有记录。当您需要查看最受欢迎的列表时,只需查询该表。

数据库通常是在Web应用程序中存储数据的最佳答案。

在这种情况下,数据库将根据访问次数对表进行索引。这使得它的插入和更新速度有点慢,但数据库的设计是为了完成这项工作,所以它不会太糟糕。由于维护索引,检索此数据总是超快。

答案 1 :(得分:1)

如果您不想使用数据库,则可以使用SortedSet来存储包含文章ID和访问次数的对象。对象的比较将是访问次数。实现可能包括TreeSet,它必须在多线程环境中进行外部同步,而ConcurrentSkipListSet则不必在外部同步。

答案 2 :(得分:0)

就个人而言,我不会在更新期间尝试回答这个问题。您更有可能在每次访问时更新您的结构而不是阅读它。

当需要阅读时,请复制每个ID,访问#条目然后对其进行排序以进行显示。你会感到很惊讶它是多么便宜。