Я пытаюсь отсортировать пользовательские объекты, хранящиеся как хэши в 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
как целые числа, чтобы избежать лексографического упорядочения, или каким-либо другим способом, который я могу придумать?