Redis заказ отсортированного набора - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь отсортировать пользовательские объекты, хранящиеся как хэши в Redis.Ключи имеют вид users:valid:2, users:valid:5, users:valid:10, users:invalid:14 и т. Д.

Моя цель - выбрать пользователей, упорядоченных по их идентификаторам ASC, сначала действительных пользователей.

Я дополнительно храню идентификаторы пользователей в отсортированном наборе, где «Score» - это идентификатор фильтра.Сопоставление фильтров похоже на { valid: 0, invalid: 1 }

$redis.zadd 'sorted-ids', 0, 2
$redis.zadd 'sorted-ids', 0, 5
$redis.zadd 'sorted-ids', 0, 10
$redis.zadd 'sorted-ids', 1, 14

. Оно позволяет извлекать идентификаторы пользователей, уже отсортированные ASC, в первую очередь действительные.Большой!Однако ...

$redis.zrange 'sorted-ids', 0, -1, with_scores: true
=> [["10", 0.0], ["2", 0.0], ["5", 0.0], ["14", 1.0]]

"10" стоит перед "2".Таким образом, идентификаторы на самом деле не ASC-упорядочены, потому что они хранятся в виде строк.

https://redis.io/commands/zadd

Когда несколько элементов имеют одинаковую оценку, они упорядочены лексикографически (онипо-прежнему упорядочены по количеству баллов в качестве первого ключа, однако локально все элементы с одинаковым баллом относительно упорядочены лексикографически).Используемый лексикографический порядок является двоичным, он сравнивает строки как массив байтов.

Есть ли способ правильно выполнить эту сортировку в Redis?Например, хранить ids как целые числа, чтобы избежать лексографического упорядочения, или каким-либо другим способом, который я могу придумать?

1 Ответ

1 голос
/ 27 апреля 2019

Вы можете дополнить свои идентификаторы (члены Sorted Set) нулями, то есть «1» станет «000000001», и лексикографическое упорядочение будет работать для вас.Однако обеспечивает уверенность в том, что длина дополненных идентификаторов остается неизменной (например, 9 цифр).

...