Использование команды SORT для получения полей HASH из отсортированного набора в Redis

Например, в redis-cli я попытался создать отсортированный набор следующим образом:

zadd sortedset 1 1 2 2 3 3

И я создал такой хэш:

hset data 1 hello 
hset data 2 goodbye
hset data 3 sir

Моя цель - хранить идентификаторы в отсортированных наборах и получать строки, хранящиеся в хэше data, отсортированные по порядку отсортированного набора.

Это то, что я пробовал до сих пор:

sort sortedset by nosort get data->*

... который выводит:

1) (nil)
2) (nil)
3) (nil)

На самом деле я ожидал, что подстановочный знак * должен быть одним из идентификаторов, хранящихся в так называемом отсортированном наборе, но похоже, что он не выполняет замену для каждого конкретного идентификатора в отсортированном наборе.

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


person Matías Fidemraizer    schedule 21.05.2015    source источник


Ответы (2)


По сути, вы правы, но текущая реализация команды SORT принимает подстановочные знаки только в левой части разыменования хеша (см. lookupKeyByPattern в sort.c). Таким образом, вместо SORT используйте для этого Lua-скрипт. Например, вот грязный быстрый:

$ redis-cli eval "return redis.call('HMGET', KEYS[2], unpack(redis.call('ZRANGEBYSCORE', KEYS[1], '-inf', '+inf')))" 2 sortedset data
1) "hello"
2) "goodbye"
3) "sir"
person Itamar Haber    schedule 21.05.2015
comment
В итоге я сделал это, предоставив идентификаторы страниц, заданные отсортированным набором, равным hmget, чтобы получить несколько хеш-ключей. - person Matías Fidemraizer; 21.05.2015
comment
Что ж, может быть, Lua — это излишество в некоторых сценариях. В моем случае я использую C# и StackExchange.Redis, но ваш подход хорош! - person Matías Fidemraizer; 21.05.2015
comment
Хорошее решение - оно имеет то преимущество, что меньше ОЗУ затрачивается на несколько вызовов. - person Itamar Haber; 21.05.2015
comment
Ре. Lua overkilling vs. SORT - я не уверен, что вы увидите большую разницу в производительности, даже если последний будет реализован так, как вы ожидали. SORT, пожалуй, самая сложная из команд Redis :) - person Itamar Haber; 21.05.2015
comment
В любом случае, отличный вопрос - заставил меня вытащить голову из своих **s, прочитать исходный код и сообщить о проблеме (github.com/antirez/redis/issues/2588) :) - person Itamar Haber; 21.05.2015
comment
ахахаха, вижу, вижу. Ну, я сказал, что это может быть излишним с точки зрения ремонтопригодности. Lua сложнее отлаживать, и, поскольку речь идет о выполнении двух операций чтения, я подумал, зачем мне здесь использовать Lua? Но в любом случае оба подхода верны, почему бы и нет - person Matías Fidemraizer; 21.05.2015
comment
Давайте продолжим обсуждение в чате. - person Itamar Haber; 21.05.2015

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

В любом случае, есть альтернативный подход: комбинация отсортированных наборов и hmget.

Если я храню идентификаторы в отсортированном наборе и я получаю их, используя ранговые диапазоны с zrange, легко получить выгруженные результаты из хэша с помощью hmget, дающего несколько хеш-ключей.

person Matías Fidemraizer    schedule 21.05.2015