#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. Я не думаю, что истечение срока действия отсортированного набора будет работать таким образом — он сможет удалить весь набор только по мере истечения срока действия, применяемого к ключу, содержащему набор, а не к членам набора.