набор сортировки в Redis с хешем в коллекции

Мы создали 3 хэша в redis, используя REPL redis-cli следующим образом:

hmset redishop:items:Articulo1 artist "Martin Wessely" price 12.99 name "Handcrafted Trees Mug" 
hmset redishop:items:Articulo2 artist "Martin Wessely" price 13.99 name "Handcrafted Trees Mug"
hmset redishop:items:Articulo3 artist "Martin Wessely" price 14.99 name "Handcrafted Trees Mug"

Я проверяю, что структуры созданы в Redis, и вот они:

hgetall redishop:items:Articulo3

Теперь добавляем хеш в набор таким образом:

sadd redishop:list-all redishop:items:Articulo3
sadd redishop:list-all redishop:items:Articulo2
sadd redishop:list-all redishop:items:Articulo1

Теперь играемся с командой SORT:

SORT redishop:list-all BY redishop:items:*->price
SORT redishop:list-all BY redishop:items:*->price GET redishop:items:*->price
SORT redishop:list-all BY redishop:items:*->price GET # GET redishop:items:*->price

Мы никогда не получаем результатов, хэш в наборе имеет значение null, и я не понимаю, почему?

с другой стороны, если мы создадим хеш и установим другим способом:

multi
hmset redishop:items:Articulo1 artist "Martin Wessely" price 12.99 name "Handcrafted Trees Mug" 
sadd redishop:list-all Articulo1
hmset redishop:items3:Articulo2 artist "Martin Wessely" price 13.99 name "Handcrafted Trees Mug"
sadd redishop:list-all Articulo2
hmset redishop:items3:Articulo3 artist "Martin Wessely" price 14.99 name "Handcrafted Trees Mug"
sadd redishop:list-all Articulo3
exec

Таким образом, команда SORT работает отлично, и хеш вставляется в набор, но я не понимаю, почему в базе документации Redis:

  1. Команда multi only отмечает начало блока транзакции. Последующие команды будут помещены в очередь для атомарного выполнения с использованием EXEC.

  2. Когда я создаю хеш с ключом key: key: key неважно, использую ли я: или, или - и, что наиболее важно в Redis, мы не создаем дерево структур в соответствии с документацией: https://redis.io/topics/data-types-intro

Они говорят вам, что лучше или хороший способ включают: или точки, но они не говорят вам, что он создает дерево структур. И тогда я не понимаю, почему, когда вы добавляете хеш в набор, если введите Articulo1 вместо redishop: items: Articulo1 в порядке, но в другом случае неверно ???? фактически, когда вы набираете hgetall Articulo1, вы получаете null, но когда вы набираете hgetall redishop: items: Articulo1, вы получаете все значения fels и ... это так странно.

  1. exec выполняет только все предложения, по этой причине должно быть одинаковое значение make it with multi или без multi.

Пожалуйста, любая помощь или объяснение по этому вопросу будет большим подспорьем. Заранее спасибо.


person charles    schedule 05.11.2017    source источник


Ответы (1)


Теперь играемся с командой SORT

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

Мы никогда не получаем результатов, хэш в наборе имеет значение null, и я не понимаю, почему?

Проблема заключается в том, как вы вызываете SORT и указываете предложения GET и BY. Поскольку членами вашего Set являются полные (хешированные) имена ключей, вот как вы должны сделать это с данными из вашего примера:

127.0.0.1:6379> SORT redishop:list-all BY *->price
1) "redishop:items:Articulo1"
2) "redishop:items:Articulo2"
3) "redishop:items:Articulo3"
127.0.0.1:6379> SORT redishop:list-all BY *->price GET *->price
1) "12.99"
2) "13.99"
3) "14.99"

Таким образом, команда SORT работает отлично.

В этом случае вы заполняете Set только частью «id» имен ключей, поэтому предложения GET и BY сопоставляются с фактическими данными. Чтобы уточнить, это не имеет ничего общего с использованием (или отсутствием) блоков MULTI.

person Itamar Haber    schedule 05.11.2017
comment
Я продолжаю, не понимая, извините. - person charles; 05.11.2017
comment
Более того, что наиболее важно, почему, если я вставляю в набор хеш между блоком multi, я могу ссылаться на него с последним идентификатором моего ключа, и SORT работает так, как я хочу, но если я сделаю то же самое из multi, я не смогу сделать то же самое ? Извините, но я не понимаю, похоже на ошибку в инструменте. - person charles; 05.11.2017
comment
Что произойдет, если в том же наборе у меня есть хэш с ключом redishop: item: cars и другие с redishop: itemsBig: truck и мне нужна цена грузовиков. Не могу я это сделать? Может быть, в документации есть ссылка, я так не думаю ... Потому что самое странное, что если я сделаю то же самое, но между несколькими блоками и ссылкой на последний идентификатор моего ключа, позже я могу использовать СОРТ по своему усмотрению. . - person charles; 05.11.2017
comment
Но если я попытаюсь сделать то же самое из мульти, то есть hmset car: 1 name X price 3000 и позже сделаю sadd mylist 1, я добавлю в набор другую вещь, отличную от car: 1, но если я сделаю то же самое, но в блоки мульти Я могу это сделать, я не понимаю почему, может это ошибка в инструменте redis-cli? - person charles; 05.11.2017
comment
Извините, я не могу понять вопрос в последнем комментарии. Возможно, попробуйте задать новый вопрос, посвященный этой проблеме и только этой проблеме. - person Itamar Haber; 07.11.2017