Редис сортировка дает странные результаты - PullRequest
0 голосов
/ 25 января 2012

Я пытаюсь выяснить, почему я получаю такие странные результаты из этого запроса сортировки:

redis> sort set:package:1:all_games by hash:game:*->rating DESC LIMIT 0 10 GET hash:game:*->rating
1. "10"
2. "10"
3. "10"
4. "9,1"
5. "9"
6. "9,2"
7. "9"
8. "9,1"
9. "9"
10. "9,4"
redis> 

Я знаю, что данные используются вместо. и это будет исправлено. Но почему это так непоследовательно? По крайней мере, я ожидаю, что это даст последовательные результаты (9,1 в последовательности).

Кто-нибудь может объяснить, что здесь происходит?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Как уже упоминалось в Ofer, по умолчанию сортировка является числовой, а элементы сравниваются как числа с плавающей запятой двойной точности.

Функция сортировки Redis работает путем заполнения массива C из исходного контейнера.Первоначальный порядок элементов в этом массиве - это порядок элементов в исходном контейнере (который не определен, например, для набора).

Каждый элемент затем помечается значением оценки.Redis использует стандартную функцию strtod для преобразования строкового значения в double.Эта функция работает с максимальным усилием: она пытается преобразовать как можно больше символов.Таким образом, строки «9», «9,1», «9,2» и «9,4» будут преобразованы в 9.0

Наконец, массив сортируется с использованием стандартного алгоритма qsort, либо алгоритм BENTLEY / McILROY (в зависимости от того, установлены ли предельные параметры или нет).AFAIK, ни один из этих алгоритмов сортировки не является стабильным .Это означает, что порядок элементов с одинаковым счетом будет случайным в результате.

Это именно то, что вы получаете на примере: сначала у вас есть 10 элементов, а затем 9 элементов.,Порядок "9" предметов является случайным.

1 голос
/ 25 января 2012

Добавить АЛЬФА в конце:

sort set:package:1:all_games by hash:game:*->rating DESC LIMIT 0 10 GET hash:game:*->rating ALPHA

По умолчанию сортировка числовая, а элементы сравниваются по значению, интерпретируемому как число с плавающей запятой двойной точности.

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

См .: http://redis.io/commands/sort

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