2014-10-08 3 views
0

Я использую sorted set типа в магазине Redis. Для каждого пользователя создать собственный KEY и поставить здесь данные:Как объединить сортированные наборы Redis?

Пример KEY:

FEED:USER:**1**, FEED:USER:**2**, FEED:USER:**3** 

Я хочу, чтобы выбрать данные из Redis для ключей пользователей: 1, 2, 3 и отсортированы по каждому счету (временная метка).

Если вы видите проблему просто, мне нужно выбрать из любого KEY данные во времени и после объединения всех результатов, отсортированных по результату.

ответ

2

Существует несколько способов сделать это, но правильный зависит от того, что вы пытаетесь сделать. Например:

  1. Вы можете использовать ZRANGEBYSCORE (или ZREVRANGEBYSCORE) в коде для каждого FEED:USER:n ключа и «сливать» ответы на клиента
  2. Вы можете сделать ZUNIONSTORE на соответствующие кнопки, а затем сделать ZRANGEBYSCORE на результат от клиента.
  3. Однако, если ваши «фиды» велики, поток №2 должен быть отменен - ​​сначала диапазон, а затем объединение.
  4. Вы также можете выполнять аналогичные виды обработки полностью на стороне сервера с помощью некоторых сценариев Lua.

EDIT: дальнейшие разъяснения

Re. 1 - Слияние может быть выполнено на стороне клиента по результатам, которые вы получаете от ZRANGEBYSCORE, или вы можете использовать серверные сценарии Lua для этого. Используйте WITHSCORES для получения метки времени и слияния/сортировки. Независимо от вашего выбора местоположения для запуска этого кода (я бы, вероятно, использовал Lua для определения местоположения), реализация зависит от вас - lmk, если вам нужна помощь с этим:

+0

Можете ли вы подробнее рассказать о параграфе 1. Мне нужен пример, как «слить». Мой счет в ** Сортированный набор ** - это метка времени. Если я получаю предметы из ** FEED: USER: 1 ** и ** FEED: USER: 2 ** Как слить их? – Arsen

+0

О ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * ** ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * После того, как вы сказали сделать ** ZRANGEBYSCORE **. Сделайте второй запрос в Redis store? Или только на стороне клиента PHP? О ** **. ** item: Я могу получить все данные по каждому ключу. Но как тогда объединить данные? В какой последовательности? – Arsen

+0

Я пробовал расшириться на # 1. Re 2. - Я не уверен, что понимаю, почему вы не можете использовать ZUNIONSTORE - если один и тот же член существует у двух разных пользователей, результат все равно будет содержать его. –

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