Параллельная карта, отсортированная по значениям с быстрым увеличением значения операции - PullRequest
4 голосов
/ 27 сентября 2010

У меня есть веб-приложение, в котором мне нужно отслеживать «самые популярные» (наиболее посещаемые) статьи. Большинство страниц (включая страницы статей) в этом приложении отображают «самый популярный» список на боковой панели, поэтому этот список будет вызываться очень часто. С другой стороны, статьи посещаются довольно часто (примерно половина посещений страниц - это посещения страниц статей).

Каков наилучший способ отслеживать посещения и иметь возможность выбрать N наиболее посещаемых статей? Как я понимаю, это должна быть параллельная карта articleId-> visitCount, которая сортируется по значениям (visitCounts) и в которой я могу быстро (и многопоточно) увеличивать visitCount и ожидать, что карта пересортируется сама.

Ответы [ 3 ]

2 голосов
/ 27 сентября 2010

Для веб-приложения лучшее место для его хранения - база данных.Создайте базу данных с полем для идентификатора статьи и полем для количества посещений.Индексируйте таблицу по количеству посещений.Каждый раз, когда статья просматривается, добавьте запись или увеличьте существующую запись.Когда вам нужно просмотреть список самых популярных, просто запросите таблицу.

Базы данных часто являются лучшим ответом на вопрос о том, где хранить данные в веб-приложении.

В этом случае база данныхбудет индексировать таблицу в зависимости от количества посещений.Это делает его немного медленнее для вставки и обновления, но базы данных предназначены для этой работы, поэтому она не будет слишком плохой.Извлечение этих данных всегда будет очень быстрым из-за поддерживаемого индекса.

1 голос
/ 27 сентября 2010

Если вы не хотите использовать базу данных, вы можете использовать SortedSet для хранения объектов, которые содержат как идентификатор статьи, так и количество посещений. Сравнение объектов будет по количеству посещений. Реализация может включать TreeSet, который должен быть внешне синхронизирован в многопоточной среде, и ConcurrentSkipListSet, который не должен быть внешне синхронизирован.

0 голосов
/ 28 сентября 2010

Лично я бы не стал отвечать на это во время обновления. Вы гораздо чаще обновляете свою структуру при каждом посещении, чем читаете ее.

Когда придет время читать, сделайте копию каждого идентификатора, посетите # entry и затем отсортируйте его для отображения. Вы будете удивлены, насколько это дешево.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...