Redis Sorted Set ZSCAN порядок товаров - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть отсортированный набор в Redis с отметкой времени, и различные типы связей с набором сохраняются вместе.

Пример набора данных поясняется ниже:

zadd s1 10 rel1:val1  
zadd s1 15 rel1:val2
zadd s1 12 rel1:val3  

zadd s1 10 rel2:v1  
zadd s1 12 rel2:v2
zadd s1 5 rel1:v3  

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

Я попробовал ZSCAN, и результаты в порядке c по баллам, как показано ниже

localhost:6379> zscan s1 0 match "rel1*" count 10
1) "0"
2) 1) "rel1:v3"
   2) "5"
   3) "rel1:val1"
   4) "10"
   5) "rel1:val3"
   6) "12"
   7) "rel1:val2"
   8) "15"

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

localhost:6379> zadd s1 -10 rel1:val1
(integer) 0
localhost:6379> zadd s1 -20 rel1:val2
(integer) 0
localhost:6379> zadd s1 -30 rel1:val3
(integer) 0
localhost:6379> zscan s1 0 match "rel1*" count 10
1) "0"
2) 1) "rel1:val3"
   2) "-30"
   3) "rel1:val2"
   4) "-20"
   5) "rel1:val1"
   6) "-10"
   7) "rel1:v3"
   8) "5"

Мой вопрос, могу ли я передать эти результаты и поверить в результаты всегда в порядке c с ZSCAN.

Я не могу использовать команды ZREVRANGE или ZRANGE, так как мне нужно получить топ-n элементов, сопоставив элементы.

1 Ответ

2 голосов
/ 10 апреля 2020

NO. Вы не можете на это полагаться. Порядок не определен.

Как мы знаем, ZSET реализован с помощью dict / ha sh и списка пропусков. Команда ZSCAN сканирует дикт, а не список пропусков. Поскольку dict неупорядочен, порядок результата сканирования не определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...