Использование Redis для функциональности трендов сейчас

Я работаю над сайтом с очень высокой пропускной способностью и большим количеством элементов, и я пытаюсь внедрить функциональность типа «в тренде сейчас», которая позволила бы пользователям быстро получить приоритетный список из N лучших элементов, которые недавно просматривались многими людьми, что постепенно исчезают, поскольку они получают меньше просмотров.

Одна из идей о том, как это сделать, состоит в том, чтобы придать больший вес недавним просмотрам элемента, что-то вроде веса 16 для каждого просмотра элемента за последние 15 минут, веса 8 для каждого просмотра элемента за последние 1 час, вес 4 для вещей за последние 4 часа и т. д., но я не знаю, правильный ли это подход.

Я хотел бы сделать это в Redis, у нас был хороший успех с Redis в прошлом для других проектов.

Как это лучше всего сделать с точки зрения технологии и определения тенденций?

Первый ответ намекает на решение, но я ищу более подробную информацию - начиная щедрость.

Обе идеи достойные, но недостаточно подробные. Один получил половину награды, но оставил вопрос открытым.


person OneSolitaryNoob    schedule 11.06.2013    source источник


Ответы (4)


Итак, я бы начал с базового упорядочения по времени (например, zset item_id оценивается по отметке времени), а затем плавал бы в зависимости от взаимодействий. Таким образом, вы можете решить, что одно взаимодействие стоит 10 минут «свежести», поэтому каждое взаимодействие добавляет столько же времени к оценке соответствующего элемента. Если все взаимодействия оцениваются одинаково, вы можете сделать это с одним zset и просто увеличивать баллы по мере возникновения взаимодействий.

Если вы хотите иметь какую-то отсрочку, скажем, оценку по квадратному корню из количества взаимодействий вместо непосредственного количества взаимодействий, вы можете создать второй zset со своей оценкой для взаимодействий и использовать zunionstore, чтобы объединить это с вашим индекс отметки времени. Для этого вы, вероятно, захотите вытащить существующую оценку, выполнить некоторые математические вычисления и добавить новую оценку поверх нее (zadd позволит вам перезаписать оценку).

Zunionstore потенциально дорог, а для достаточно больших наборов даже zadd/zincrby становится дорогим. С этой целью вы можете захотеть сохранить только N элементов с наивысшей оценкой, например, для N = 10 000, в зависимости от потребностей вашего приложения.

person Mark Tozzi    schedule 03.07.2013

Эти две ссылки очень полезны:

http://stdout.heyzap.com/2013/04/08/surfacing-interesting-content/

http://word.bitly.com/post/41284219720/forget-table

person Bill Lubanovic    schedule 05.09.2013
comment
Размещать только ссылки обычно рискованно; вы останетесь висеть, если ссылки когда-либо станут недействительными. - person Dennis Meng; 06.09.2013
comment
Спасибо Билл. Я заглянул в забывчивый стол. Похоже, он не масштабируется далеко. Пример представляет собой отсортированный набор из ~ 260 стран, который считывается полностью. Всего с 260 элементами это нормально, но не сработает с десятками миллионов. Может быть способ разделить их данные на множество ключей Redis и использовать их метод распада, но это делает утомительным поиск самых популярных сейчас элементов. (и Билл прав, ссылки со временем могут устареть) - person OneSolitaryNoob; 10.09.2013
comment
Похоже, первая ссылка мертва. Это та же самая статья qwerjk.com/posts/surfacing-interesting-content? - person smilly92; 08.03.2015

Алгоритм ранжирования Reddit довольно хорошо справляется с тем, что вы описываете. Хорошая запись здесь, в которой рассказывается, как это работает.

https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9

person Nick Sullivan    schedule 04.06.2014
comment
Эта ссылка, кажется, указывает на автономный сервер. Это может помочь (medium.com/hacking-and- Гонзо/) - person Zobayer Hasan; 11.07.2017

рассмотрим упорядоченный набор с количеством просмотров в качестве баллов. при каждом доступе к элементу увеличивайте его оценку (http://redis.io/commands/zincrby). таким образом вы можете получить лучшие предметы из набора, упорядоченного по количеству очков.

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

person akonsu    schedule 11.06.2013
comment
спасибо, используя этот подход, как предметы станут менее горячими? - person OneSolitaryNoob; 11.06.2013
comment
Большое спасибо, ZINCRBY выглядит действительно полезным. подробнее о структуре? что самое большее, что я мог бы ожидать положить в этот набор? много ли будет нескольких миллионов? Является ли подход к работе с исчезновением cron разумным способом делать что-то? - person OneSolitaryNoob; 12.06.2013
comment
Я полагаю, вы можете поместить в свой набор столько элементов, сколько Redis может поместиться в память. это зависит от размера вашего сервера. мне работа cron или фоновый процесс кажутся разумными, да. Я бы также поэкспериментировал с конкатенацией счетчиков попаданий с временными метками и добавлением их в баллы набора вместо того, чтобы стирать элементы из фонового процесса. - person akonsu; 12.06.2013