#redis
#redis
Вопрос:
Наборы обычно не упорядочены по своей природе. Но мне интересно, поддерживается ли SMEMBERS в Redis структурой данных, которая обеспечивает порядок.
В этом коротком документе ничего не задокументировано: https://redis.io/commands/smembers
и примечания в EVAL нелегко понять.
В Redis версии 4 команды, которые могут возвращать элементы в случайном порядке, такие как SMEMBERS (поскольку наборы Redis неупорядочены), имеют другое поведение при вызове из Lua и проходят молчаливый лексикографический фильтр сортировки перед возвратом данных в сценарии Lua. Таким образом, redis.call(«smembers»,KEYS[1]) всегда будет возвращать заданные элементы в том же порядке, в то время как одна и та же команда, вызываемая обычными клиентами, может возвращать разные результаты, даже если ключ содержит точно такие же элементы. Однако, начиная с Redis 5, такого этапа упорядочения больше нет, потому что Redis 5 реплицирует сценарии таким образом, что больше не требуется преобразование недетерминированных команд в детерминированные. В общем, даже при разработке для Redis 4 никогда не предполагайте, что определенные команды в Lua будут упорядочены, а вместо этого полагайтесь на документацию исходной команды, которую вы вызываете, чтобы увидеть свойства, которые она предоставляет.
Вкратце, обеспечивает ли redis порядок результатов при каждом вызове SMEMBERS?
Версия redis, которую мы используем:
127.0.0.1:6379> info
# Server
redis_version:5.0.3
Ответ №1:
НЕТ, результат НЕ является детерминированным.
Интересно, поддерживается ли SMEMBERS в Redis структурой данных, которая обеспечивает порядок.
Базовой структурой данных является ХЭШ-таблица, которая НЕ упорядочена.