2015-08-28 6 views
0

Я работаю над веб-сайтом. Я хотел получить отзывы о дизайне. Функция сайта похожа на Reddit, ProductHunt и т. Д. (Т. Е. На основе голосования). Вот обзор 1. Бэкэнд-сервис получает сообщения из Интернета и хранит в БД. 2. Сообщения отображаются на веб-сайте (вверху, новинке). 3. В верхнем разделе показан веб-сайт, основанный на рейтинге (голосов, временных факторах). 4. На свитке, пользователь видеть больше сообщенийАрхитектор сайта/приложения, основанного на голосовании

Дизайн:

Таблицы базы данных: Сообщения, пользователи, голос

Backend обслуживание: бэкенда службы получает сообщения из сети периодически и хранит в БД (сообщения Таблица).

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

Вопрос: Должен ли я использовать кеш Redis вместо запроса базы данных для получения ранжированных сообщений по каждому запросу? Если да, то что нужно хранить в кеше и какова должна быть логика обновления кеша?

Если я в конечном итоге использую кеш, кеш должен содержать две записи. 1. Ранжированные должности 1. Новые должности. Для ранжированных должностей необходимо периодически обновлять кеш обновления службы? и для новых сообщений следует ли я аннулировать кеш всякий раз, когда новая почта выводится из Интернета?

Также как иметь дело с бесконечным прокруткой, если я иду с кеш-маршрутом? Пример: пользователь видит сообщения, основанные на ранжировании. Пользователь прокручивает новые сообщения через 15 минут. к тому времени рейтинг мог бы измениться.

Буду признателен за любые отзывы/помощь!

ответ

0

Я думаю, что Redis поможет вам здесь с точки зрения производительности, и вы можете использовать его как кэш, а также как реальную базу данных (в ней есть все, что вам нужно - настойчивость, резервное копирование, репликация master-slave, серверный кластер).
Если вы хотите использовать его в качестве кэш-памяти, это то, что вы можете сделать:

  • Для ранжированных сообщений вы можете использовать Sorted Sets. Это позволит вам получить оценку за каждый пост, который будет числом голосов, и он будет сортировать ваши сообщения на основе этой оценки. У вас есть команда для увеличения оценки существующего сообщения - ZINCRBY.Вы можете обновлять кеш в то же время при обновлении базы данных
  • Для новых сообщений вы можете использовать lists, так как вы можете легко добавлять элементы перед списком, когда создается новое сообщение, используя LPUSH, а также сохраняйте это фиксированная длина с использованием LTRIM
  • Для бесконечной прокрутки есть больше решений, все с их ценой: вы можете использовать команду ZRANGEBYSCORE с параметром Limit, чтобы получить пункты , поэтому, если что-то меняется, отобразите его
  • Также, когда вам понадобится сделать 2 или более команды в атомном режиме, например, если вы хотите, чтобы новые сообщения создавались для поддержания всегда l atest 50 вам нужно назвать LPUSH и LTRIM одной командой, вы можете сделать это с помощью LUA Scripting
+0

Спасибо @Liviu! Это очень полезно. Я все еще не могу разобраться в подкачке. Возьмем пример: упорядоченный набор, основанный на голосах: a, b, x, g, d, e, c, f, y, s. 10 пунктов заказов на основе голосов. страница отображает 5 элементов. когда пользователь прокручивает следующие 5 элементов. перед тем, как пользователь прокручивает для следующих элементов, задает изменения и, следовательно, порядок сообщений. Новый набор выглядит так: a, b, f, y, x, g, s, d, e, c. Некоторые из элементов из 5-го списка переместились в следующий ковш, а некоторые элементы со второй страницы перенесли в первую очередь. прокрутка даст дубликаты, а также пропустит некоторые предметы. –

+0

Нет идеального решения для этого, проще всего создать моментальный снимок, когда пользователь запросит его (который может потреблять много памяти, если у вас много одновременных пользователей). Но если вы хотите иметь курсор на сервере, вам нужен какой-то идентификатор для пересылки по нему, а не по размеру набора. В вашем случае, если оценка может идти только в UP, тогда ее можно использовать. Последний элемент, который вы получили на первой странице, был d, поэтому вам нужно запомнить его оценку, и, когда вы запрашиваете вторую страницу, вы запрашиваете только этот счет, поэтому вы должны получать только e и c и, таким образом, избегать дубликатов. https://dev.twitter.com/rest/public/timelines –

Смежные вопросы