Как мне сохранить это в Redis?

#database #model #schema #redis

#База данных #Модель #схема #redis

Вопрос:

У меня много продуктов (product_id). Пользователи (user_id) просматривают продукты.

Я хочу запросить, какие пользователи просматривали какой-либо продукт за последние 24 часа. (Другими словами, я хочу сохранить список идентификаторов пользователя, прикрепленный к этому идентификатору продукта … и когда для пользователя истекают 24 часа, этот пользователь выпадает из этого списка, и запись исчезает)

Как мне сохранить это в Redis? Может кто-нибудь дать мне высокоуровневую схему, потому что я новичок в Redis.

Ответ №1:

Для чего-то подобного я использую отсортированный набор со значениями, представляющими собой идентификаторы пользователей, а оценка — текущее время. При обновлении набора удалите старые элементы с помощью ZREMRANGEBYSCORE, а также обновите оценку времени для текущего пользователя.

Обновление с помощью кода:

Всякий раз, когда добавляется новый элемент:

 ZREMRANGEBYSCORE recentitems 0 [DateTime.Now.AddMinutes(-10).Ticks]
ZADD recentitems [DateTime.Now.Ticks] [item.id]
  

Чтобы получить идентификаторы элементов, добавленных за последние 10 минут:

 ZREVRANGEBYSCORE recentitems [DateTime.Now.Ticks] [DateTime.Now.AddMinutes(-10).Ticks]
  

Обратите внимание, что вы также могли бы использовать

 ZREVRANGE recentitems 0 -1 
  

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

Это дает вам список идентификаторов элементов. Затем вы используете GET / MGET / HGET / HMGET соответствующим образом для извлечения фактических элементов для отображения.

Комментарии:

1. Можете ли вы подробнее объяснить, как это работает? Я в замешательстве. Что будет содержать отсортированный набор?

Ответ №2:

Если вы хотите, чтобы ключи redis удалялись автоматически, то вы, вероятно, захотите использовать ключ redis для каждой привязки идентификатора пользователя к идентификатору продукта. Итак, вы бы написали, выполнив что-то вроде, redis.set "user-to-products:user_id:product_id", timestamp за которым redis.expire "user-to-products:user_id:product_id" 86400 следует (24 часа, в секундах).

Чтобы получить текущий список, вы должны быть в состоянии выполнить redis.keys "user-to-products:user_id:*"

Комментарии:

1. Это масштабируемый способ сделать это? Насколько быстро выполняется поиск с помощью *?

2. Это поиск по хэш-таблице, поэтому он должен быть быстрым, но не на 100% идеальным. На веб-сайте redis есть дополнительная информация о поиске ключевых шаблонов . Для чего-то действительно масштабируемого вы должны следовать ответу Тома Кларксона.

3. Просто хотел добавить, что если вы хотите получить лучшее из обоих миров, вы можете использовать EXPIRE для установки 24-часовых часов для вашего отсортированного набора, тогда пользователи, которые не посещают более 24 часов, автоматически удаляются из базы данных, и вам нужно только ZREMRANGEBYSCORE для ключей, которые все еще существуют (ваши активные пользователи).

4. Не могли бы вы подробнее рассказать о методе sorted-set? Что будет внутри отсортированного набора? Зачем мне EXPIRE, если я выполняю ZREMRANGEBYSCORE?

5. Я не думаю, что истечение срока действия отсортированного набора будет работать таким образом — он сможет удалить весь набор только по мере истечения срока действия, применяемого к ключу, содержащему набор, а не к членам набора.