Перейти к содержанию

Radix

В данном разделе приведены сведения о Radix, плагине для СУБД Picodata.

Picodata Enterprise

Функциональность плагина доступна только в коммерческой версии Picodata.

Общие сведения

Radix — реализация Redis на базе Picodata, предназначенная для замены существующих инсталляций Redis.

Плагин Radix состоит из одноименного сервиса (radix), реализующего Redis на базе СУБД Picodata. Каждый экземпляр Radix открывает дополнительный порт для подключения.

При использовании Picodata c плагином Radix нет необходимости в отдельной инфраструктуре Redis Sentinel, так как каждый узел Picodata выполняет роль прокси ко всем данным Redis.

Установка

Предварительные действия

Установка плагина Radix, в целом, соответствует общей процедуре установки плагинов в Picodata, но имеет ряд особенностей.

Процедура установки включает:

  • установку адреса, который будет слушать Radix (например, export RADIX_LISTEN_ADDR=0.0.0.0:7379). Эта настройка также доступна для инвентарного файла Ansible. Если в одном пространстве имен (например, на одном хосте) запущено несколько инстансов Picodata, то нужно задать для них разные значения RADIX_LISTEN_ADDR.
  • установку публичного адреса, который Radix будет использовать для кластерных команд (например, export RADIX_ADVERTISE_ADDR=public.hostname.int:7379). Этот адрес будет возвращаться клиентам (например, в CLUSTER NODES).
  • установку у тиров, на которые предполагается развернуть плагин, 16384 бакетов. См. описание bucket_count и default_bucket_count.
  • запуск инстанса Picodata с поддержкой плагинов (параметр --share-dir)
  • распаковку архива Radix в директорию, указанную на предыдущем шаге
  • подключение к административной консоли инстанса
  • выполнение SQL-команд для регистрации плагина, привязки его сервиса к тиру, выполнения миграции, включения плагина в кластере

Подключение плагина

Radix поддерживает 16 баз данных, каждую из которых можно расположить на отдельном тире. На одном тире можно разместить несколько баз данных. Ниже будут примеры для одного и двух тиров.

Для подключение плагина последовательно выполните следующие SQL-команды в административной консоли Picodata.

CREATE PLUGIN radix 0.11.0;

Пример с двумя тирами (hot/cold)

Для настройки миграций задайте значения для 16 параметров (по числу баз данных в Radix):

ALTER PLUGIN radix 0.11.0 SET migration_context.tier_0='hot';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_1='hot';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_2='hot';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_3='hot';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_4='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_5='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_6='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_7='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_8='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_9='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_10='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_11='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_12='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_13='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_14='cold';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_15='cold';

ALTER PLUGIN radix 0.11.0 ADD SERVICE radix TO TIER hot;
ALTER PLUGIN radix 0.11.0 ADD SERVICE radix TO TIER cold;

Для выполнения миграции:

ALTER PLUGIN radix MIGRATE TO 0.10.0 OPTION(TIMEOUT=300);

Для включения плагина в кластере:

Убедитесь, что задан адрес, который будет слушать Radix
ALTER PLUGIN radix 0.11.0 ENABLE OPTION(TIMEOUT=30);

Если в кластере ранее была включена предыдущая версия плагина, то ее следует сначала отключить и лишь затем включить новую версию. Пример:

ALTER PLUGIN radix 0.10.0 DISABLE OPTION(TIMEOUT=30);
ALTER PLUGIN radix 0.11.0 ENABLE OPTION(TIMEOUT=30);

Чтобы убедиться в том, что плагин успешно добавлен и запущен, выполните запрос:

SELECT * FROM _pico_plugin;

В строке, соответствующей плагину Radix, в колонке enabled должно быть значение true.

Пример с одним тиром

Если в кластере используется только один тир default, настройка миграций будет выглядеть так:

ALTER PLUGIN radix 0.11.0 SET migration_context.tier_0='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_1='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_2='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_3='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_4='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_5='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_6='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_7='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_8='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_9='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_10='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_11='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_12='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_13='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_14='default';
ALTER PLUGIN radix 0.11.0 SET migration_context.tier_15='default';
ALTER PLUGIN radix 0.11.0 ADD SERVICE radix TO TIER default;

Настройка

Для настройки плагина используйте файл конфигурации, который можно применить к плагину с помощью Picodata Pike или инвентарного файла Ansible.

Пример файла конфигурации:

clients:                 # ограничения клиентских соединений
    max_clients: 10000
    max_input_buffer_size: 1073741824
    max_output_buffer_size: 1073741824
cluster_mode: true       # какой флаг отдавать в команде `info cluster`
sentinel_enabled: false  # режим совместимости с Redis Sentinel
redis_compatibility:
    enabled_deprecated_commands: []
    enforce_one_slot_transactions: false
authorization_mode:
    state: Off

Сетевые настройки

  • RADIX_LISTEN_ADDR — Radix откроет сокет по указанному адресу и будет его слушать.
  • RADIX_ADVERTISE_ADDR — Radix будет использовать этот адрес в кластерных и sentinel-командах.

Note

Если процессы не изолированы (например, развёртывание произведено без использования Docker или Kubernetes), то необходимо указывать разные RADIX_LISTEN_ADDR на каждом узле, чтобы избежать конфликтов портов.

clients

max_clients

Максимальное количество клиентов, которые могут подключиться к одному узлу Radix. При достижении максимального числа max_clients новые соединения будут отклоняться, пока количество клиентов не станет снова меньше max_clients. Отклоненные соединения увеличивают счетчик метрики rejected_connections (пока доступна только через INFO STATS).

max_input_buffer_size

Максимальный размер входящего буфера. Если данный параметр у соединения будет превышен, то соединение будет закрыто. Закрытые по этой причине соединения увеличивают счетчик метрики client_query_buffer_limit_disconnections (пока доступна только через INFO STATS).

max_output_buffer_size

Максимальный размер исходящего буфера. Если данный параметр у соединения будет превышен, то соединение будет закрыто. Закрытые по этой причине соединения увеличивают счетчик метрики client_output_buffer_limit_disconnections (пока доступна только через INFO STATS).

redis_compatibility

enabled_deprecated_commands

Список устаревших команд Redis через запятую, которые будут доступны при работе с Radix.

enforce_one_slot_transactions

Проводить все SQL-транзакции принудительно в рамках одного слота (бакета). Данное поведение выключено по умолчанию, т.е. транзакции проводятся в рамках одного инстанса.

С выключенным флагом вы можете эмулировать Redis Standalone, развернув Radix в составе одного репликасета.

cluster_mode

Данная настройка влияет только на вывод команды info cluster.

sentinel_enabled

Включает режим совместимости с Redis Sentinel.

Пример миграции приложения на Radix

В настройках приложения следует указывать service_name (master_name) и адрес сервера Redis Sentinel из одного тира. Например, service_namecold_4, а адрес Sentinel — cold_4_1, если топология кластера похожа на топологию ниже.

# вариант топологии Radix
hot:
  hot_1:
  - hot_1_1
  - hot_1_2
  hot_2:
  - hot_2_1
  - hot_2_2
cold:
  cold_1:
  - cold_1_1
  - cold_1_2
  cold_2:
  - cold_2_1
  - cold_2_2
  cold_3:
  - cold_3_1
  - cold_3_2
  cold_4:
  - cold_4_1
  - cold_4_2

authorization_mode

Управляет состоянием авторизации в Radix. Возможные значения:

  • { "state": "on", "default_user_name": "<str>" } — авторизация включена, пользователь по умолчанию задан. Используется для клиентов, которые подключаются с помощью AUTH password без имени пользователя
  • { "state": "on" } — авторизация включена, пользователь по умолчанию не задан. В этом случае команды AUTH password без имени пользователя работать не будут
  • { "state": "off" } — авторизация выключена (значение по умолчанию)

Предустановленные роли

  • Глобальные:
    • radix_reader — доступ на чтение ко всем данным,
    • radix_writer — доступ на запись ко всем данным.
  • Локальные для каждой БД:
    • radix_reader_0radix_reader_15
    • radix_writer_0radix_writer_15

Примеры использования

Миграция с кластера с директивой requirepass
ALTER PLUGIN radix 0.11.0 SET radix.authorization_mode = '{ "state": "On", "default_user_name": "default_radix_user" }';
CREATE USER default_radix_user WITH PASSWORD 'S0m1Str2ngP3ssword';
GRANT radix_reader TO default_radix_user;
GRANT radix_writer TO default_radix_user;
$ redis-cli -p 7301
127.0.0.1:7301> GET abc
(error) NOAUTH Authentication required
127.0.0.1:7301> AUTH S0m1Str2ngP3ssword
OK
127.0.0.1:7301> SET abc 123
OK
Использование LDAP
ALTER PLUGIN radix 0.11.0 SET radix.authorization_mode = '{ "state": "On", "default_user_name": "default_radix_user" }';
CREATE USER default_radix_user USING ldap;
GRANT radix_reader TO default_radix_user;
GRANT radix_writer TO default_radix_user;
Использование Argus для синхронизации пользователей
argus:
  searches:
    - role: "radix_reader"
      base: "dc=example,dc=org"
      filter: "<filter>"
      attr: "cn"
    - role: "radix_writer"
      base: "dc=example,dc=org"
      filter: "<filter>"
      attr: "cn"
Разделение доступов по БД
ALTER PLUGIN radix 0.11.0 SET radix.authorization_mode = '{ "state": "On" }';

CREATE USER app_1_user WITH PASSWORD 'pwd1';
GRANT radix_reader_0 TO app_1_user;
GRANT radix_writer_0 TO app_1_user;

CREATE USER app_2_user WITH PASSWORD 'pwd2';
GRANT radix_reader_0 TO app_2_user;
GRANT radix_writer_2 TO app_2_user;

CREATE USER app_3_user WITH PASSWORD 'pwd3';
GRANT radix_reader_0 TO app_3_user;
GRANT radix_writer_5 TO app_3_user;

Использование

Для работы с Radix используйте клиентскую программу redis-cli. Подключение осуществляется по адресу, заданному в RADIX_ADVERTISE_ADDR (или RADIX_LISTEN_ADDR, если публичный адрес не указан).

redis-cli -p 7301

Поддерживаемые команды

Управление кластером

cluster getkeysinslot

CLUSTER GETKEYSINSLOT slot count
поддерживается с версии 0.4.0

Возвращает набор ключей, которые, в соответствии со своими хэш-суммами, относятся к указанному слоту. Второй аргумент ограничивает максимальное количество возвращаемых ключей.

cluster keyslot

CLUSTER KEYSLOT key
поддерживается с версии 0.4.0

Позволяет узнать, к какому хэш-слоту относится указанный в команде ключ.

cluster myid

CLUSTER MYID
поддерживается с версии 0.4.0

Возвращает идентификатор текущего узла кластера (INSTANCE UUID).

cluster myshardid

CLUSTER MYSHARDID
поддерживается с версии 0.4.0

Возвращает идентификатор текущего репликасета, в который входит текущий узел кластера (REPLICASET UUID).

cluster nodes

CLUSTER NODES
поддерживается с версии 0.5.0

Возвращает информацию о текущем составе и конфигурации узлов кластера, включая номера бакетов, относящихся к узлам.

cluster replicas

CLUSTER REPLICAS node-id
поддерживается с версии 0.5.0

Возвращает состав реплицированных узлов (т.е. состав репликасета)

cluster shards

CLUSTER SHARDS
поддерживается с версии 0.5.0

Возвращает подробную информацию о шардах кластера.

cluster slots

CLUSTER SLOTS
поддерживается с версии 0.5.0

Возвращает информацию о соответствии слотов инстансам кластера.

echo

ECHO message
поддерживается с версии 0.11.0

Возвращает сообщение (message).

ping

PING [message]
поддерживается с версии 0.1.0

Возвращает PONG, если аргумент не указан, в противном случае возвращает строкой аргумент, который пришел. Эта команда полезна для:

  • проверки того, живо ли еще соединение
  • проверки способности сервера обслуживать данные — ошибка возвращается, если это не так (например, при загрузке из постоянного хранилища или обращении к устаревшей реплике)
  • измерения задержки

readonly

READONLY
поддерживается с версии 0.10.0

Переводит сессию в режим, в котором получение данных производится не с лидеров репликасетов, а с резервных реплик (при факторе репликации ≥ 2).

Управление соединениями

auth

auth password
поддерживается с версии 0.10.0

Производит аутентификацию пользователем по умолчанию. Имя пользователя должно быть задано в конфигурации плагина в параметре default_user_name.

auth username password

Производит аутентификацию выбранным пользователем.

reset

reset
поддерживается с версии 0.10.0

Сбрасывает соединение в состояние по умолчанию:

  • откатывается текущая транзакция, если она была открыта,
  • сбрасываются наблюдения за ключами, которые раньше были установлены командой WATCH,
  • если были открыты курсоры командами SCAN/HSCAN, то они закрываются,
  • сбрасывается авторизация, потребуется ее пройти заново.

select

SELECT index
поддерживается с версии 0.1.0

Получение логической базы данных Redis с указанным нулевым числовым индексом. Новые соединения всегда используют базу данных 0.

Общие команды

dbsize

DBSIZE
поддерживается с версии 0.5.0

Возвращает количество ключей в базе данных

del

DEL key [key ...]
поддерживается с версии 0.1.0

Удаляет указанные ключи. Несуществующие ключи игнорируются.

exists

EXISTS key [key ...]
поддерживается с версии 0.1.0

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

expire

EXPIRE key seconds [NX | XX | GT | LT]
поддерживается с версии 0.1.0

Устанавливает срок жизни (таймаут) для ключа key в секундах (TTL, time to live). По истечении таймаута ключ будет автоматически удален. В терминологии Redis ключ с установленным тайм-аутом часто называют волатильным.

Тайм-аут будет сброшен только командами, которые удаляют или перезаписывают содержимое ключа, включая DEL, SET и GET/SET. Это означает, что все операции, которые концептуально изменяют значение, хранящееся в ключе, не заменяя его новым, оставляют таймаут нетронутым.

expireat

EXPIREAT key unix-time-seconds [NX | XX | GT | LT]
поддерживается с версии 0.7.0

Устанавливает срок жизни (таймаут) для ключа key подобно EXPIRE, но вместо оставшегося числа секунд (TTL, time to live) использует абсолютное время Unix timestamp — число секунд, прошедших с 01.01.1970. Если максимальное число секунд превышено (т.е. дата отсчета находится ранее 01.01.1970), то ключ будет автоматически удален.

Дополнительные параметры EXPIREAT:

  • NX — установить срок жизни только если он не был ранее установлен
  • XX — установить срок жизни только если ключ уже имеет ранее установленный срок
  • GT — установить срок жизни только если он превышает ранее установленный срок
  • LT — установить срок жизни только если он меньше ранее установленного срока

expiretime

EXPIRETIME key
поддерживается с версии 0.7.0

Возвращает срок жизни (таймаут) ключа key в секундах согласно формату Unix timestamp.

keys

KEYS pattern
поддерживается с версии 0.1.0

Возвращает все ключи, соответствующие шаблону.

Поддерживаются шаблоны в стиле glob:

  • h?llo соответствует hello, hallo и hxllo
  • h*llo соответствует hllo и heeeello
  • h[ae]llo соответствует hello и hallo, но не hillo
  • h[^e]llo соответствует hallo, hbllo, ... но не hello
  • h[a-b]llo соответствует hallo и hbllo

persist

PERSIST key
поддерживается с версии 0.1.0

Удаляет существующий таймаут для ключа key, превращая его из непостоянного (ключ с установленным сроком действия) в постоянный (ключ, срок действия которого никогда не истечет, поскольку таймаут для него не установлен).

pexpire

PEXPIRE key milliseconds [NX | XX | GT | LT]
поддерживается с версии 0.7.0

Устанавливает срок жизни (таймаут) для ключа key подобно EXPIRE, но в миллисекундах.

pexpireat

PEXPIREAT key unix-time-milliseconds [NX | XX | GT | LT]
поддерживается с версии 0.7.0

Устанавливает срок жизни (таймаут) для ключа key подобно EXPIREAT, но в миллисекундах.

pexpiretime

PEXPIRETIME key
поддерживается с версии 0.7.0

Возвращает срок жизни (таймаут) ключа key подобно EXPIRETIME, но в миллисекундах.

pttl

PTTL key
поддерживается с версии 0.7.0

Возвращает оставшееся время жизни ключа key подобно TTL, но в миллисекундах.

scan

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
поддерживается с версии 0.1.0

Команда SCAN используется для инкрементного итерационного просмотра коллекции элементов в выбранной в данный момент базе данных Redis.

ttl

TTL key
поддерживается с версии 0.1.0

Возвращает оставшееся время жизни ключа key, для которого установлен таймаут. Эта возможность интроспекции позволяет клиенту Redis проверить, сколько секунд данный ключ будет оставаться частью набора данных.

Команда возвращает -2, если ключ не существует.

Команда возвращает -1, если ключ существует, но не имеет связанного с ним истечения срока действия.

type

TYPE key
поддерживается с версии 0.1.0

Возвращает строковое представление типа значения, хранящегося по адресу ключа key. Могут быть возвращены следующие типы:

  • string
  • list
  • set
  • zset
  • hash
  • stream

UNLINK key [key ...]
поддерживается с версии 0.10.0

Выполняет асинхронное удаление ключей. Работает точно также, как и DEL, за исключением того, что фактическое удаление данных происходит в фоне.

Можно использовать для повышения отзывчивости приложения.

Хэш-команды

hdel

HDEL key field [field ...]
поддерживается с версии 0.1.0

Удаляет указанные поля из хэша, хранящегося по адресу ключа key. Указанные поля, которые не существуют в этом хэше, игнорируются. Удаляет хэш, если в нем не осталось полей. Если key не существует, он рассматривается как пустой хэш, и эта команда возвращает 0.

hexists

HEXISTS key field
поддерживается с версии 0.1.0

Возвращает, является ли поле field существующим полем в хэше, хранящемся по адресу ключа key.

hget

HGET key field
поддерживается с версии 0.1.0

Возвращает значение, связанное с полем field в хэше, хранящемся по адресу ключа key.

hgetall

HGETALL key
поддерживается с версии 0.1.0

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

hincrby

HINCRBY key field increment
поддерживается с версии 0.1.0

Увеличивает число, хранящееся в поле field, в хэше, хранящемся в ключе key, на инкремент. Если ключ не существует, создается новый ключ, содержащий хэш. Если поле не существует, то перед выполнением операции его значение устанавливается в 0.

Диапазон значений, поддерживаемых HINCRBY, ограничен 64-битными знаковыми целыми числами.

hkeys

HKEYS key
поддерживается с версии 0.1.0

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

hlen

HLEN key
поддерживается с версии 0.1.0

Возвращает количество полей, содержащихся в хэше, хранящемся по адресу ключа key.

hmget

HMGET key field [field ...]
поддерживается с версии 0.10.0

Возвращает значения указанных полей из хэша.

hmset

HMSET key field value [field value ...]
поддерживается с версии 0.10.0

Выставляет значения указанным полям для заданного хэша.

Примечание

Вместо этой команды необходимо использовать команду HSET Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.11.0 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "enabled_deprecated_commands": ["hmset" ] }';

hscan

HSCAN key cursor [MATCH pattern] [COUNT count] [NOVALUES]
поддерживается с версии 0.1.0

Работает подобно SCAN, но с некоторым отличием: HSCAN выполняет итерацию полей типа Hash и связанных с ними значений.

hset

HSET key field value [field value ...]
поддерживается с версии 0.1.0

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

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

hvals

HVALS key
поддерживается с версии 0.7.0

Возвращает значения всех полей в хэше, хранящиеся по адресу ключа key.

Команды для сортированных множеств

bzmpop

BZMPOP timeout numkeys key [key ...] <MIN | MAX> [COUNT count]
поддерживается с версии 0.10.0

Вариант команды ZMPOP с блокировкой. Ведет себя аналогично ZMPOP в ситуации:

  • когда хотя бы в одном из сортированных множеств, хранящихся по указанным ключам (key), есть элементы
  • при использовании внутри блока MULTI или EXEC.

Если все сортированные множества пусты, то Radix заблокирует соединение до тех пор, пока другой клиент не добавит значение хотя бы к одному множеству в указанных ключах key, либо не истечет время таймаута timeout. Если таймаут установить в 0, то блокировка будет бесконечной.

bzpopmax

BZPOPMAX key [key ...] timeout
поддерживается с версии 0.10.0

Вариант команды ZPOPMAX с блокировкой. Ведет себя так же как ZPOPMAX, но при отсутствии элементов во всех cортированных множествах, хранящихся по ключам key, блокирует соединение. В остальных случаях возвращает один элемент с наивысшей оценкой из первого непустого ключа из переданных в команду. Блокировка истекает после таймаута timeout. Если таймаут установить в 0, то блокировка будет бесконечной.

bzpopmin

BZPOPMIN key [key ...] timeout
поддерживается с версии 0.10.0

Вариант команды ZPOPMIN с блокировкой. Ведет себя так же как ZPOPMIN, но при отсутствии элементов во всех cортированных множествах, хранящихся по ключам key, блокирует соединение. Возвращает один элемент с наименьшей оценкой из первого непустого ключа из переданных в команду. Блокировка истекает после таймаута timeout. Если таймаут установить в 0, то блокировка будет бесконечной.

zadd

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
поддерживается с версии 0.10.0

Добавляет указанные элементы (member) и соответствующие им оценки (score) к сортированному множеству, хранящемуся по ключу key. Если указанного ключа key нет, он будет создан, а элементы — добавлены в новое сортированное множество. Если ключ key существует, но в нем нет сортированного множества, команда вернет ошибку. Если указанный элемент уже есть в сортированном множестве, то он будет вставлен повторно на ту же позицию с обновленной оценкой.

Дополнительные параметры:

  • NX — только добавить новые элементы (существующие не обновлять)
  • XX — только обновить существующие элементы (новые не добавлять)
  • GT — обновить существующие элементы только если их новые оценки выше, а также добавить новые элементы (если указаны)
  • LT — обновить существующие элементы только если их новые оценки ниже, а также добавить новые элементы (если указаны)
  • CH — учитывать в выводе не только новые элементы, но и измененные. В таком случае команда вернет число, отражающее сумму новых элементов и тех существующих элементов, для которых была обновлена оценка. Если указать в команде существующие элементы с их текущей оценкой, то они не будут учтены.
  • INCR — заставляет ZADD вести себя как ZINCRBY. В этом режиме можно указать только одну пару оценка/элемент.
Примечание

Параметры GT,LT и NX можно использовать только по отдельности, не сочетая друг с другом.

zcard

ZCARD key
поддерживается с версии 0.10.0

Возвращает мощность множества (количество элементов в сортированном множестве), хранящемся по ключу key.

zcount

ZCOUNT key min max
поддерживается с версии 0.10.0

Возвращает мощность множества (количество элементов в сортированном множестве), хранящемся по ключу key, с оценкой в диапазоне от min до max. Поведение аргументов min и max такое же, как в ZREMRANGEBYSCORE.

zdiff

ZDIFF numkeys key [key ...] [WITHSCORES]
поддерживается с версии 0.10.0

Работает аналогично ZDIFFSTORE, но вместо записи результирующего сортированного множества выводит его клиенту.

zdiffstore

ZDIFFSTORE destination numkeys key [key ...]
поддерживается с версии 0.10.0

Вычисляет разницу между первым и последующими сортированными множествами (хранящимися в соответствующих ключах key) и записывает его в destination. Перед списком ключей необходимо указать их количество (numkeys). Команда выводит количество элементов в результирующем множестве. Несуществующий ключ обрабатывается как ключ, содержащий пустое сортированное множество. Если целевое множество в destination уже существует, оно будет перезаписано.

Примеры:

127.0.0.1:7379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:7379> ZADD zset1 2 "two"
(integer) 1
127.0.0.1:7379> ZADD zset1 3 "three"
(integer) 1
127.0.0.1:7379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:7379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:7379> ZDIFFSTORE out 2 zset1 zset2
(integer) 1
127.0.0.1:7379> ZRANGE out 0 -1 WITHSCORES
1) "three"
2) "3"

zincrby

ZINCRBY key increment member
поддерживается с версии 0.10.0

Увеличивает оценку элемента member в сортированном множестве, хранящегося по ключу key, на величину increment. Если указанный элемент в множестве отсутствует, то он будет создан с оценкой, равной increment. Если указанного ключа key нет, он будет создан, и элемент добавлен в новое сортированное множество. Если ключ key существует, но в нем нет сортированного множества, команда вернет ошибку. Величина increment может быть отрицательной (в таком случае оценка будет понижена).

zinter

ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]]
  [AGGREGATE <SUM | MIN | MAX>] [WITHSCORES]
поддерживается с версии 0.10.0

Работает аналогично ZINTERSTORE, но вместо записи результирующего сортированного множества выводит его клиенту.

zinterstore

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight
  [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
поддерживается с версии 0.10.0

Вычисляет пересечение элементов из двух или более сортированных множеств, хранящихся по указанным ключам (key) в виде нового сортированного множества и записывает его в destination. Перед списком ключей необходимо указать их количество (numkeys). Команда выводит количество элементов в результирующем множестве.

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

Дополнительные параметры WEIGHTS и AGGREGATE ведут себя так же, как в команде ZUNIONSTORE.

Пример:

127.0.0.1:7379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:7379> ZADD zset1 2 "two"
(integer) 1
127.0.0.1:7379> ZADD zset2 1 "one"
(integer) 1
127.0.0.1:7379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:7379> ZADD zset2 3 "three"
(integer) 1
127.0.0.1:7379> ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 2
127.0.0.1:7379> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "two"
4) "10"

zlexcount

ZLEXCOUNT key min max
поддерживается с версии 0.10.0

Возвращает количество всех элементов из сортированного множества, хранящегося по ключу key, в лексикографическом диапазоне от min до max. Аргументы min и max применяются так же, как в команде ZRANGEBYLEX.

zmpop

ZMPOP numkeys key [key ...] <MIN | MAX> [COUNT count]
поддерживается с версии 0.10.0

Извлекает один или несколько элементов, составляющих пары оценка/элемент, из первого непустого сортированного множества на основании указанного наборы ключей key.

Модификатор MIN позволяет выводить элементы с наименьшей оценкой, MAX — с наивысшей. Параметр COUNT ограничивает число элементов (по умолчанию — 1).

zmscore

ZMSCORE key member [member ...]
поддерживается с версии 0.10.0

Возвращает оценки указанных элементов (member) сортированных множеств, хранящихся по указанному ключу key. Если элемент отсутствует в множестве, то для него будет выведена оценка nil.

zpopmax

ZPOPMAX key [count]
поддерживается с версии 0.10.0

Извлекает указанное в count число элементов с наивысшей оценкой из сортированного множества, хранящегося по указанному ключу. По умолчанию count равен 1. Если указанный count больше мощности множества, то ошибки не будет. Команда выводит элементы с сортировкой по убыванию оценки.

zpopmin

ZPOPMIN key [count]
поддерживается с версии 0.10.0

Извлекает указанное в count число элементов с наименьшей оценкой из сортированного множества, хранящегося по указанному ключу. По умолчанию count равен 1. Если указанный count больше мощности множества, то ошибки не будет. Команда выводит элементы с сортировкой по возрастанию оценки.

zrandmember

ZRANDMEMBER key [count [WITHSCORES]]
поддерживается с версии 0.10.0

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

Дополнительный параметр count позволяет указать количество выводимых элементов. Если добавить WITHSCORES, то в вывод будут включены оценки элементов. Если указанный count положителен, то будет выведен массив элементов размером либо с count, либо мощность множества (смотря какое значение ниже). Если указанный count отрицателен, то поведение команды меняется: один и тот же элемент может быть возвращен несколько раз. Размер итогового массива при этом будет равняться абсолютному значению count.

zrange

ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count]
  [WITHSCORES]
поддерживается с версии 0.10.0

Возвращает указанный набор элементов из сортированного множества, хранящегося по ключу key. Команда может выполять разные типы запросов, выводя наборы элементов: по индексу, по оценки, в лексиграфическом порядке.

Следующие параметры меняют поведение команды:

  • BYSCORE — сортировка элементов по возрастанию их оценок. Элементы с одинаковыми оценками сортируются лексикографически
  • BYLEX — лексикографическая сортировка элементов с одинаковой оценкой
  • REV — оценка элементов множества в обратном порядке

Дополнительный параметр LIMIT позволяет ограничить результат явно заданными рамками (offset — смещение, count — число элементов). Отрицательное значение count выведет все элементы после offset. Дополнительный параметр WITHSCORES позволяет включить в вывод оценки элементов.

Диапазоны индексов

По умолчанию команда выполняет запрос на основе индексов. Отрезок от start до stop позволяет ограничить вывод элементов и обрабатывается включительно (0 соответствует первому элементу). Например, команда ZRANGE myzset 0 1 выведет только первый и второй элемент из множества в ключе myzset. Отрицательные значения обозначают позицию относительно конца множества (-1 — последний элемент). Индексы, выходящие за пределы диапазона, не вызывают ошибку. Если start больше конечного индекса сортированного множества или stop, возвращается пустой список. Если stop больше конечного индекса сортированного множества, команда будет использовать последний элемент сортированного множества.

Диапазоны оценок

Если указан параметр BYSCORE, команда ведет себя как ZRANGEBYSCORE и возвращает диапазон элементов из сортированного множества, имеющих оценки, равные или лежащие между start и stop.

start и stop могут быть -inf и +inf, обозначая отрицательную и положительную бесконечность соответственно. Это означает, что вам не нужно знать наивысшую или наименьшую оценку в сортированном множестве, чтобы получить все элементы с определенной оценкой или выше.

По умолчанию интервалы оценок, указанные с помощью start и stop, являются замкнутыми. Можно указать открытый интервал, добавив перед оценкой символ (.

Например:

элементы с оценкой > 1 и <= 5
ZRANGE zset (1 5 BYSCORE
элементы с оценкой > 5 и < 10
ZRANGE zset (5 (10 BYSCORE

Обратные диапазоны

Использование параметра REV обращает сортированное множество, при этом индекс 0 будет относиться к элементу с наивысшей оценкой.

По умолчанию, чтобы вернуть какие-либо результаты, значение start должно быть меньше или равно stop. Однако, если использован параметр BYSCORE или BYLEX, значение start является наивысшей оценкой, которую следует учитывать, а stop — наименьшей. Поэтому, чтобы вернуть какие-либо результаты, значение start должно быть больше или равно stop.

Например:

элементы между индексами 5 и 10 в обратном порядке
ZRANGE zset 5 10 REV
элементы с оценками меньше 10 и больше 5
ZRANGE zset 10 5 REV BYSCORE

Лексикографические диапазоны

При использовании параметра BYLEX команда ведет себя как ZRANGEBYLEX и возвращает диапазон элементов из сортированного множества между лексикографическими закрытыми интервалами диапазона start и stop.

Обратите внимание, что лексикографическая сортировка ожидает, что оценки у всех элементов множества будут одинаковыми. Если элементы имеют разные оценки, то ответ может быть любым.

Допустимые значения start и stop должны начинаться с ( или [, чтобы указать, является ли интервал диапазона открытым или замкнутым, соответственно.

Специальные значения + или - для start и stop означают положительные и отрицательные бесконечные строки, соответственно, поэтому, например, команда ZRANGE myzset - + BYLEX гарантированно возвращает все элементы в сортированном множестве (при условии, что все элементы имеют одинаковую оценку).

Параметр REV меняет порядок элементов start и stop, где start должен быть лексикографически больше stop, чтобы получить непустой результат.

Лексикографическое сравнение строковых значений

Строки сравниваются как двоичный массив байтов. В случае с набором символов ASCII сравнение происходит обычным словарным способом.

Приложение сохраняет регистр символов, но не учитывает его при сравнении. Для сравнения используются строки, приведенные к нижнему регистру, для вывода результата — исходные значения.

Двоичная природа сравнения позволяет использовать сортированные множества в качестве индекса общего назначения, например, первая часть элемента может быть 64-разрядным числом в формате big-endian. Поскольку в числах big-endian наиболее значимые байты находятся в начальных позициях, двоичное сравнение будет соответствовать числовому сравнению чисел. ЭЭто можно использовать для реализации запросов по диапазону на 64-разрядных значениях. Как показано в примере ниже, после первых 8 байт мы можем хранить значение индексируемого элемента.

Пример:

> ZADD myzset 1 "one" 2 "two" 3 "three"
(integer) 3
> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
> ZRANGE myzset 2 3
1) "three"
> ZRANGE myzset -2 -1
1) "two"
2) "three"

Дополнительные примеры:

127.0.0.1:7379> ZADD myzset 1 "one" 2 "two" 3 "three"
(integer) 3
127.0.0.1:7379> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:7379> ZRANGE myzset 0 3 BYSCORE
1) "one"
2) "two"
3) "three"
127.0.0.1:7379> ZRANGE myzset 0 3 REV BYSCORE
1) "three"
2) "two"
3) "one"
127.0.0.1:7379> ZRANGE myzset 0 3 BYLEX
(empty array)
127.0.0.1:7379> ZRANGE myzset 0 3 BYSCORE LIMIT 1 1
1) "two"
2) "three"

zrangestore

ZRANGESTORE destination src min max [BYSCORE | BYLEX] [REV] [LIMIT offset
  count]
поддерживается с версии 0.10.0

Работает аналогично ZRANGE, но вместо вывода результирующего сортированного множества записывает его в destination.

zrangebylex

ZRANGEBYLEX key min max [LIMIT offset count]
поддерживается с версии 0.10.0

Работает аналогично ZRANGE c параметром вывода BYLEX.

Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.11.0 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "enabled_deprecated_commands": ["zrangebylex" ] }';

zrangebyscore

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
поддерживается с версии 0.10.0

Работает аналогично ZRANGE c параметром вывода BYSCORE.

Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.11.0 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "enabled_deprecated_commands": ["zrangebyscore" ] }';

zrank

ZRANK key member [WITHSCORE]
поддерживается с версии 0.10.0

Возвращает позиции элемента (member) в сортированном множестве, хранящемся по указанному ключу key, с сортировкой по возрастанию оценки. Отсчет начинается с 0. Дополнительный параметр WITHSCORE добавляет в вывод команды сами оценки.

Для вывода позиций элементов по возрастанию оценки (включая в вывод сами оценки) используйте ZREVRANK.

zrem

ZREM key member [member ...]
поддерживается с версии 0.10.0

Удаляет указанные элементы из сортированного множества, хранящегося по ключу key. Если указанный элемент отсутствует в множестве, то такой элемент игнорируется. Если ключ key существует, но в нем нет сортированного множества, команда вернет ошибку.

zremrangebylex

ZREMRANGEBYLEX key min max
поддерживается с версии 0.10.0

Удаляет все элементы из сортированного множества, хранящегося по ключу key, в лексикографическом диапазоне от min до max. Аргументы min и max применяются так же, как в команде ZRANGEBYLEX.

zremrangebyrank

ZREMRANGEBYRANK key start stop
поддерживается с версии 0.10.0

Удаляет все элементы из сортированного множества, хранящегося по ключу key, с позиции в диапазоне от start до stop. Значение 0— наиболее низкая позиция, -1 — наивысшая позиция, -2 — вторая после наивысшей и т.д.

zremrangebyscore

ZREMRANGEBYSCORE key min max
поддерживается с версии 0.10.0

Удаляет все элементы из сортированного множества, хранящегося по ключу key, с оценкой в диапазоне от min до max включительно.

zrevrange

ZREVRANGE key start stop [WITHSCORES]
поддерживается с версии 0.10.0

Работает аналогично ZRANGE c параметром вывода REV.

Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.11.0 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "enabled_deprecated_commands": ["zrevrange" ] }';

zrevrangebylex

ZREVRANGEBYLEX key max min [LIMIT offset count]
поддерживается с версии 0.10.0

Работает аналогично ZRANGE c параметрами вывода REV и BYLEX.

Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.11.0 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "enabled_deprecated_commands": ["zrevrangebylex" ] }';

zrevrangebyscore

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
поддерживается с версии 0.10.0

Работает аналогично ZRANGE c параметрами вывода REV и BYSCORE.

Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.11.0 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "enabled_deprecated_commands": ["zrevrangebyscore" ] }';

zrevrank

ZREVRANK key member [WITHSCORE]
поддерживается с версии 0.10.0

Возвращает позиции элемента (member) в сортированном множестве, хранящемся по указанному ключу key, с сортировкой по убыванию оценки. Отсчет начинается с 0. Дополнительный параметр WITHSCORE добавляет в вывод команды сами оценки.

Для вывода позиций элементов по возрастанию оценки (включая в вывод сами оценки) используйте ZRANK.

zscan

ZSCAN key cursor [MATCH pattern] [COUNT count]
поддерживается с версии 0.10.0

См. SCAN

zscore

ZSCORE key member
поддерживается с версии 0.10.0

Возвращает оценку элемента member в сортированном множестве, хранящемся по ключу key.

zunion

ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]]
  [AGGREGATE <SUM | MIN | MAX>] [WITHSCORES]
поддерживается с версии 0.10.0

Работает аналогично ZUNIONSTORE, но вместо записи результирующего сортированного множества выводит его клиенту.

zunionstore

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
  [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
поддерживается с версии 0.10.0

Объединяет элементы двух или более сортированных множеств, хранящихся по указанным ключам (key) в новое сортированное множество и записывает его в destination. Объединение происходит на основе оценок элементов, которые встречаются в исходных множествах. Перед списком ключей необходимо указать их количество (numkeys). Команда выводит количество элементов в результирующем множестве.

Дополнительный параметр WEIGHTS позволяет указать "вес" для каждого исходного множества. Это число будет использовано как мультипликатор для оценок в множестве.

Дополнительный параметр AGGREGATE позволяет указать способ объединения. По умолчанию, это суммирование (SUM), однако можно указать запись минимальной (MIN) или максимальной (MAX) оценки элемента из всех исходных множеств, где он встречается.

Примеры:

127.0.0.1:7379> ZADD zset1 1 "one"
(integer) 1
127.0.0.1:7379> ZADD zset1 2 "two"
(integer) 1
127.0.0.1:7379> ZADD zset2 2 "two"
(integer) 1
127.0.0.1:7379> ZADD zset2 3 "three"
(integer) 1
127.0.0.1:7379> ZUNIONSTORE zsetout11 2 zset1 zset2 WEIGHTS 1 1
(integer) 3
127.0.0.1:7379> ZUNIONSTORE zsetout23 2 zset1 zset2 WEIGHTS 2 3
(integer) 3
127.0.0.1:7379> ZUNIONSTORE zsetout34 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE MIN
(integer) 3
127.0.0.1:7379> ZRANGE zsetout11 0 1000 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"
5) "two"
6) "4"
127.0.0.1:7379> ZRANGE zsetout23 0 1000 WITHSCORES
1) "one"
2) "2"
3) "three"
4) "9"
5) "two"
6) "10"
127.0.0.1:7379> ZRANGE zsetout34 0 1000 WITHSCORES
1) "one"
2) "2"
3) "two"
4) "4"
5) "three"
6) "9"

Команды для списков

blmove

BLMOVE source destination <LEFT | RIGHT> <LEFT | RIGHT> timeout
поддерживается с версии 0.4.0

Работает аналогично LMPOP, но с использованием блокировки. Если исходный список (source) пуст, то команда будет ждать наполнения списка в течение указанного в timeout времени (в секундах), и в случае неудачи вернет ошибку. Если таймаут установить в 0, то блокировка будет бесконечной.

blmpop

BLMPOP timeout numkeys key [key ...] <LEFT | RIGHT> [COUNT count]
поддерживается с версии 0.3.0

Работает аналогично LMOVE, но с использованием блокировки. Если все указанные списки ключей пусты, то команда будет ждать наполнения любого из них в течение указанного в timeout времени (в секундах), и в случае неудачи вернет ошибку. Если таймаут установить в 0, то блокировка будет бесконечной.

blpop

BLPOP key [key ...] timeout
поддерживается с версии 0.3.0

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

brpop

BRPOP key [key ...] timeout
поддерживается с версии 0.3.0

Работает аналогично RPOP, но с использованием блокировки. Поведение механизма блокировки аналогично таковому для BLPOP.

lindex

LINDEX key index
поддерживается с версии 0.3.0

Возвращает элемент с указанным индексом (index) из списка, хранящегося по указанному ключу key. Индекс 0 означает первый элемент списка, -1 — последний и т.д.

Примеры:

127.0.0.1:7379> LPUSH mylist "World"
(integer) 1
127.0.0.1:7379> LPUSH mylist "Hello"
(integer) 2
127.0.0.1:7379> LINDEX mylist 0
"Hello"
127.0.0.1:7379> LINDEX mylist -1
"World"
127.0.0.1:7379> LINDEX mylist 3
(nil)
127.0.0.1:7379>

linsert

LINSERT key <BEFORE | AFTER> pivot element
поддерживается с версии 0.3.0

Вставляет в список, хранящийся по ключу key, элемент (element) до (BEFORE) или после (AFTER) указанного другого элемента (pivot). Если указан несуществующий ключ, то команда ничего не сделает. Если по указанному ключу нет списка, то команда вернет ошибку.

Примеры:

127.0.0.1:7379> RPUSH mylist "Hello"
(integer) 1
127.0.0.1:7379> RPUSH mylist "World"
(integer) 2
127.0.0.1:7379> LINSERT mylist BEFORE "World" "There"
(integer) 3
127.0.0.1:7379> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
127.0.0.1:7379>

llen

LLEN key
поддерживается с версии 0.3.0

Возвращает длину (количество элементов) списка, хранящегося по ключу key. Если указан несуществующий ключ, то команда вернет 0. Если по указанному ключу нет списка, то команда вернет ошибку.

Примеры:

127.0.0.1:7379> LPUSH mylist "World"
(integer) 1
127.0.0.1:7379> LPUSH mylist "Hello"
(integer) 2
127.0.0.1:7379> LLEN mylist
(integer) 2

lmove

LMOVE source destination <LEFT | RIGHT> <LEFT | RIGHT>
поддерживается с версии 0.3.0

Перемещает первый/последний элемент первого списка (source) в начало/конец второго списка (destination).

Примеры:

127.0.0.1:7379> RPUSH mylist "one"
(integer) 1
127.0.0.1:7379> RPUSH mylist "two"
(integer) 2
127.0.0.1:7379> RPUSH mylist "three"
(integer) 3
127.0.0.1:7379> LMOVE mylist myotherlist RIGHT LEFT
"three"
127.0.0.1:7379> LMOVE mylist myotherlist LEFT RIGHT
"one"
127.0.0.1:7379> LRANGE mylist 0 -1
1) "two"
127.0.0.1:7379> LRANGE myotherlist 0 -1
1) "three"
2) "one"
127.0.0.1:7379>

lmpop

LMPOP numkeys key [key ...] <LEFT | RIGHT> [COUNT count]
поддерживается с версии 0.3.0

Извлекает (и удаляет) один или несколько (count) элементов в начале (LEFT) или в конце (REFT) из первого непустого списка ключей (key) в перечне списков ключей.

Примеры:

127.0.0.1:7379> LMPOP 2 non1 non2 LEFT COUNT 10
(nil)
127.0.0.1:7379> LPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
127.0.0.1:7379> LMPOP 1 mylist LEFT
1) "mylist"
2) 1) "five"
127.0.0.1:7379> LRANGE mylist 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:7379> LMPOP 1 mylist RIGHT COUNT 10
1) "mylist"
2) 1) "one"
   2) "two"
   3) "three"
   4) "four"
127.0.0.1:7379> LPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
127.0.0.1:7379> LPUSH mylist2 "a" "b" "c" "d" "e"
(integer) 5
127.0.0.1:7379> LMPOP 2 mylist mylist2 right count 3
1) "mylist"
2) 1) "one"
   2) "two"
   3) "three"
127.0.0.1:7379> LRANGE mylist 0 -1
1) "five"
2) "four"
127.0.0.1:7379> LMPOP 2 mylist mylist2 right count 5
1) "mylist"
2) 1) "four"
   2) "five"
127.0.0.1:7379> LMPOP 2 mylist mylist2 right count 10
1) "mylist2"
2) 1) "a"
   2) "b"
   3) "c"
   4) "d"
   5) "e"
127.0.0.1:7379> EXISTS mylist mylist2
(integer) 0
127.0.0.1:7379>

lpop

LPOP key [count]
поддерживается с версии 0.3.0

Извлекает (и удаляет) указанное число (count) первых элементов, хранящихся в списке по адресу ключа key. Без аргумента count команда извлекает один первый элемент в начале списка.

Примеры:

127.0.0.1:7379> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
127.0.0.1:7379> LPOP mylist
"one"
127.0.0.1:7379> LPOP mylist 2
1) "two"
2) "three"
127.0.0.1:7379> LRANGE mylist 0 -1
1) "four"
2) "five"

lpos

LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
поддерживается с версии 0.3.0

Возвращает индекс найденного в списке, хранящегося по ключу key, элемента (element). Без дополнительных аргументов эта команда просканирует список слева направо и вернет индекс первого найденного элемента. Нумерация элементов начинается с 0.

Пример:

> RPUSH mylist a b c 1 2 3 c c
> LPOS mylist c
2

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

Примеры:

> LPOS mylist c RANK 2
6
> LPOS mylist c RANK -1
7

Параметр COUNT позволяет вывести позиции всех (по счету num-matches) найденных элементов.

Пример:

> LPOS mylist c COUNT 2
[2,6]

При совместном использовании COUNT и RANK можно изменить точку отсчета, с которой будет производиться поиск совпадений.

Пример:

> LPOS mylist c RANK -1 COUNT 2
[7,6]

lpush

LPUSH key element [element ...]
поддерживается с версии 0.3.0

Вставляет указанные элементы в начала списка, хранящегося по ключу key.

Примеры:

127.0.0.1:7379> LPUSH mylist "world"
(integer) 1
127.0.0.1:7379> LPUSH mylist "hello"
(integer) 2
127.0.0.1:7379> LRANGE mylist 0 -1
1) "hello"
2) "world"

lpushx

LPUSHX key element [element ...]
поддерживается с версии 0.3.0

Работает аналогично LPUSH, но проверяет, что указанный ключ key существует. В противном случае команда ничего не делает (в отличие от LPUSH).

lrange

LRANGE key start stop
поддерживается с версии 0.3.0

Возвращает диапазон элементов списка, хранящегося по ключу key. Позиция start обозначает начало диапазона, stop — его конец. При указании отрицательных значений можно использовать диапазон, отсчитанный справа налево. Нумерация элементов списка начинается с нуля. Некорректный диапазон будет воспринят либо как пустой список (если start превышает максимальный номер элемента), либо как корректный с отсечением пустой части (если stop превышает максимальный номер элемента). Следует учитывать, что при прямом отсчете элементов слева направо значение stop будет включено в состав элементов. То есть, диапазон LRANGE list 0 10 будет содержать 11 элементов.

Примеры:

127.0.0.1:7379> RPUSH mylist "one"
(integer) 1
127.0.0.1:7379> RPUSH mylist "two"
(integer) 2
127.0.0.1:7379> RPUSH mylist "three"
(integer) 3
127.0.0.1:7379> LRANGE mylist 0 0
1) "one"
127.0.0.1:7379> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
127.0.0.1:7379> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
127.0.0.1:7379> LRANGE mylist 5 10
(empty array)

lrem

LREM key count element
поддерживается с версии 0.3.0

Удаляет из списка, хранящегося по ключу key, указанное количество (count) найденных элементов (element). Положительное значение count означает поиск слева направо, отрицательное — справа налево. При значении 0 будут удалены все найденные элементы.

Примеры:

127.0.0.1:7379> RPUSH mylist "hello"
(integer) 1
127.0.0.1:7379> RPUSH mylist "hello"
(integer) 2
127.0.0.1:7379> RPUSH mylist "foo"
(integer) 3
127.0.0.1:7379> RPUSH mylist "hello"
(integer) 4
127.0.0.1:7379> LREM mylist -2 "hello"
(integer) 2
127.0.0.1:7379> LRANGE mylist 0 -1
1) "hello"
2) "foo"
127.0.0.1:7379>

lset

LSET key index element
поддерживается с версии 0.3.0

Устанавливает индекс (index) для добавляемого элемента (element). Таким образом можно затереть один элемент списка и заменить его новым значением.

Примеры:

127.0.0.1:7379> RPUSH mylist "one"
(integer) 1
127.0.0.1:7379> RPUSH mylist "two"
(integer) 2
127.0.0.1:7379> RPUSH mylist "three"
(integer) 3
127.0.0.1:7379> LSET mylist 0 "four"
"OK"
127.0.0.1:7379> LSET mylist -2 "five"
"OK"
127.0.0.1:7379> LRANGE mylist 0 -1
1) "four"
2) "five"
3) "three"
127.0.0.1:7379>

ltrim

LTRIM key start stop
поддерживается с версии 0.3.0

Обрезает список, хранящийся по ключу key, задавая его размер с помощью диапазона. При указании отрицательных значений можно использовать диапазон, отсчитанный справа налево. Нумерация элементов списка начинается с нуля. Некорректный диапазон будет воспринят либо как пустой список (если start превышает максимальный номер элемента) c удалением ключей, либо как корректный с увеличением границ списка (если stop превышает максимальный номер элемента).

Типичное применение LTRIM:

LPUSH mylist someelement
LTRIM mylist 0 99

Эти команды добавят в список значение someelement и при этом установят емкость списка равной 100 элементам.

Дополнительные примеры:

127.0.0.1:7379> RPUSH mylist "one"
(integer) 1
127.0.0.1:7379> RPUSH mylist "two"
(integer) 2
127.0.0.1:7379> RPUSH mylist "three"
(integer) 3
127.0.0.1:7379> LTRIM mylist 1 -1
"OK"
127.0.0.1:7379> LRANGE mylist 0 -1
1) "two"
2) "three"
127.0.0.1:7379>

rpop

RPOP key [count]
поддерживается с версии 0.4.0

Извлекает (и удаляет) указанное число (count) последних элементов, хранящихся в списке по адресу ключа key. Без аргумента count команда извлекает один первый элемент в начале списка.

Примеры:

127.0.0.1:7379> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
127.0.0.1:7379> RPOP mylist
"five"
127.0.0.1:7379> RPOP mylist 2
1) "four"
2) "three"
127.0.0.1:7379> LRANGE mylist 0 -1
1) "one"
2) "two"

rpush

RPUSH key element [element ...]
поддерживается с версии 0.3.0

Работает аналогично LPUSH, но добавляет элементы в конец списка.

rpushx

RPUSHX key element [element ...]
поддерживается с версии 0.3.0

Работает аналогично RPUSH, но проверяет существование ключа key и то, что этот ключ содержит список. В противном случае команда ничего не делает.

Команды управления подпиской (Pub/Sub)

Pub/Sub — механизм для отправки сообщений между клиентами через каналы.

psubscribe

PSUBSCRIBE pattern [pattern ...]
поддерживается с версии 0.2

Подписывает клиента на получение данных согласно указанному шаблону (pattern). Примеры шаблонов:

  • h?llo подписывает на hello, hallo и hxllo
  • h*llo подписывает на hllo и heeeello
  • h[ae]lloподписывает на hello и hallo, но не hillo

publish

PUBLISH channel message
поддерживается с версии 0.2

Размещает сообщение (message) в указанном канале (channel). Сообщение будет доступно клиентам вне зависимости от того, к какому узлу кластера они подключены.

pubsub channels

PUBSUB CHANNELS [pattern]
поддерживается с версии 0.2

Выводит список активных каналов. Канал считается активным, если на него есть хотя бы один подписчик (подписка на шаблоны (pattern) не считается). Если в команде не указан шаблон (pattern), то будут выведены все активные каналы. В противном случае будут выведены только те активные каналы, которые соответствуют шаблону.

pubsub numpat

PUBSUB NUMPAT
поддерживается с версии 0.2

Выводит список уникальных шаблонов, на которые были произведены подписки со стороны клиентов (с помощью команды PSUBSCRIBE). Не следует путать вывод этой команды с общим числом клиентов.

pubsub numsub

PUBSUB NUMSUB [channel [channel ...]]
поддерживается с версии 0.2

Выводит список всех подписчиков указанных каналов. Подписчики на шаблоны (pattern) не считаются.

punsubscribe

PUNSUBSCRIBE [pattern [pattern ...]]
поддерживается с версии 0.2

Отписывает клиента от указанных шаблонов. Если ни один канал (pattern) не указан, то клиент будет отписан от всех шаблонов.

subscribe

SUBSCRIBE channel [channel ...]
поддерживается с версии 0.2

Подписывает клиента на получение данных из указанных каналов (channel). Cм. также PSUBSCRIBE.

unsubscribe

UNSUBSCRIBE [channel [channel ...]]
поддерживается с версии 0.2

Отписывает клиента от указанных каналов. Если ни один канал (channel) не указан, то клиент будет отписан от всех каналов.

Команды для строк

get

GET key
поддерживается с версии 0.1.0

Получает значение ключа key. Если ключ не существует, возвращается специальное значение nil. Если значение, хранящееся в ключе, не является строкой, возвращается ошибка, поскольку GET работает только со строковыми значениями.

getrange

GETRANGE key start end
поддерживается с версии 0.3.0

Возвращает подстроку из значения, хранящегося по указанному ключу. Границы подстроки определяют аргументами start и end.

incr

INCR key
поддерживается с версии 0.4.3

Увеличивает значение, хранящееся по указанному ключу, на 1. Если указанный ключ не существует, то его значение принимается за 0.

incrby

INCRBY key increment
поддерживается с версии 0.4.3

Увеличивает значение, хранящееся по указанному ключу, на величину increment. Если указанный ключ не существует, то его значение принимается за 0.

incrbyfloat

INCRBYFLOAT key increment
поддерживается с версии 0.4.3

Увеличивает значение, хранящееся по указанному ключу, на величину increment, но при этом поддерживает дробные и отрицательные значения. Если указанный ключ не существует, то его значение принимается за 0.

psetex

PSETEX key milliseconds value
поддерживается с версии 0.7.0

Устанавливает значение и срок жизни (таймаут) для ключа key подобно SETEX, но в миллисекундах.

Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.11.0 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "enabled_deprecated_commands": ["psetex" ] }';

set

SET key value [NX | XX] [GET] [EX seconds | PX milliseconds |
  EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
поддерживается с версии 0.1.0

Сохраняет строковое значение в ключе. Если ключ уже содержит значение, оно будет перезаписано, независимо от его типа. Любое предыдущее ограничение таймаута, связанное с ключом, отменяется при успешном выполнении операции SET.

Параметры:

  • EX — установка указанного времени истечения срока действия в секундах (целое положительное число)
  • PX — установка указанного времени истечения в миллисекундах (целое положительное число)
  • EXAT — установка указанного времени Unix, в которое истекает срок действия ключа, в секундах (целое положительное число)
  • PXAT — установка указанного времени Unix, по истечении которого срок действия ключа истечет, в миллисекундах (целое положительное число)
  • NX — установка значение ключа только в том случае, если он еще не существует
  • XX — установка значение ключа только в том случае, если он уже существует
  • KEEPTTL — сохранить время жизни, связанное с ключом
  • GET — возвращает старую строку, хранящуюся по адресу ключа, или nil, если ключ не существовал. Возвращается ошибка и SET прерывается, если значение, хранящееся по адресу ключа key, не является строкой.

setex

SETEX key seconds value
поддерживается с версии 0.7.0

Устанавливает для ключа key значение value и срок жизни (таймаут) в секундах. Аналогичный результат достигается так:

SET key value EX seconds
Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.11.0 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "enabled_deprecated_commands": ["setex" ] }';

Установка некорректного значения вернет ошибку.

setnx

SETNX key value
поддерживается с версии 0.7.0

Устанавливает для ключа key значение value только если такого ключа ранее не было.

Примечание

Данная команда отнесена в Redis в разряд устаревших и по умолчанию отключена в Radix. Для включения используйте следующий SQL-запрос:

ALTER PLUGIN RADIX 0.11.0 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "enabled_deprecated_commands": ["setnx" ] }';

strlen

STRLEN key
поддерживается с версии 0.3.0

Возвращает длину текстового значения, хранящегося по указанному ключу.

Команды для получения информации о Sentinel

Radix поддерживает необходимый минимум команд для того, чтобы приложения могли получать адреса серверов Picodata, если эти приложения написаны с поддержкой Sentinel.

По умолчанию перечисленные ниже команды отключены. Для того, чтобы их включить, используйте запрос:

ALTER PLUGIN radix 0.11.0 set radix.sentinel_enabled = 'true';
поддерживается с версии 0.10.0

sentinel get-master-addr-by-name

SENTINEL GET-MASTER-ADDR-BY-NAME <replicaset name>
поддерживается с версии 0.10.0

Возвращает адрес Радикса для заданного репликасета.

sentinel master

SENTINEL MASTER <replicaset name>
поддерживается с версии 0.10.0

Выводит мастера для заданного репликасета. Radix возвращает мастера репликасета с соответствующим именем.

sentinel masters

SENTINEL MASTERS
поддерживается с версии 0.10.0

Возвращает список репликасетов, которые есть в системе.

sentinel myid

SENTINEL MYID
поддерживается с версии 0.10.0

Возвращает id текущего инстанса

sentinel replicas

SENTINEL REPLICAS <replicaset name>
поддерживается с версии 0.10.0

Показывает список реплик для заданного репликасета.

sentinel sentinels

SENTINEL SENTINELS <replicaset name>
поддерживается с версии 0.10.0

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

Команды для скриптов

Radix поддерживает следующие команды для работы с Lua-скриптами:

eval

EVAL script numkeys [key [key ...]] [arg [arg ...]]
поддерживается с версии 0.5.0

Вызывает Lua-скрипт. Первый аргумент — исходный код Lua-скрипта (script). Следующий за ним аргумент — количество передаваемых ключей (numkeys) и далее сами ключи и их аргументы.

Пример:

> EVAL "return ARGV[1]" 0 hello
"hello"

Поддерживаемые скриптовые функции для EVAL:

  • redis.call(command)— вызов команды Redis и вывод ее результата (при его наличии)
  • redis.pcall(command) — аналог redis.call(), но с гарантированным возвратом ответа, что удобно для анализа ошибок команд
  • redis.log(level, message) — запись в журнал инстанса сообщения с указанием уровня важности. Например, redis.log(redis.LOG_WARNING, 'Something is terribly wrong')
  • redis.sha1hex(x) — возврат шестнадцатеричного SHA1-хэша для указанного числа x
  • redis.status_reply(x) — возврат статуса состояния x в виде строки
  • redis.error_reply — возврат состояния x в виде строки
  • redis.REDIS_VERSION — возврат текущей версии Redis в виде строки в формате Lua
  • redis.REDIS_VERSION_NUM— возврат текущей версии Redis в виде номера

evalro

EVAL_RO script numkeys [key [key ...]] [arg [arg ...]]
поддерживается с версии 0.5.0

Вызывает Lua-скрипт аналогично eval, но в режиме "только чтение", т.е. без модификации данных БД.

evalsha

EVALSHA sha1 numkeys [key [key ...]] [arg [arg ...]]
поддерживается с версии 0.5.0

Вызывает Lua-скрипт аналогично eval, но в качестве аргумента принимает не сам скрипт, а его SHA1-хэш из кэша скриптов.

evalsharo

EVALSHA_RO sha1 numkeys [key [key ...]] [arg [arg ...]]
поддерживается с версии 0.5.0

Вызывает Lua-скрипт аналогично evalsha, но в режиме "только чтение", т.е. без модификации данных БД.

script exists

SCRIPT EXISTS sha1 [sha1 ...]
поддерживается с версии 0.6.0

Возвращает информацию о существовании скрипта с указанным хэшем SHA1 в кэше скриптов.

script flush

SCRIPT FLUSH [ASYNC | SYNC]
поддерживается с версии 0.11.0

Очищает кэш Lua-скриптов. По умолчанию, операция производится в синхронном режиме. Пользователь может указать режим явно:

  • ASYNC — очистить кэш асинхронно
  • SYNC — очистить кэш синхронно

script load

SCRIPT LOAD script
поддерживается с версии 0.6.0

Загружает скрипт в кэш скриптов. Работает идемпотентно (т.е. подразумевая, что такой скрипт уже есть в хранилище).

Команды для транзакций

discard

DISCARD
поддерживается с версии 0.6.0

Удаляет все команды из очереди исполнения

exec

EXEC
поддерживается с версии 0.6.0

Исполняет все команды в очереди в рамках единой транзакции.

multi

MULTI
поддерживается с версии 0.6.0

Обозначает момент блокировки транзакции. Последующие команды будут исполняться одна за другой при помощи exec.

unwatch

UNWATCH key [key ...]
поддерживается с версии 0.6.0

Удаляет все ключи из списка наблюдения watch.

watch

WATCH key [key ...]
поддерживается с версии 0.6.0

Включает проверку значений указанных ключей для последующих транзакций.

Команды управления и диагностики

flushall

FLUSHALL [ASYNC | SYNC]
поддерживается с версии 0.10.0

Очищает все базы данных.

  • SYNC: синхронно, т.е. команда вернет управление только после полной очистки БД.
  • ASYNC: асинхронно, команда вернет управление быстрее, данные очистятся в фоне.

Если ни одна из опций не указана, используется режим SYNC

flushdb

FLUSHDB [ASYNC | SYNC]
поддерживается с версии 0.10.0

Очищает текущую базу данных.

  • SYNC: синхронно — команда вернет управление только после полной очистки БД
  • ASYNC: асинхронно — команда вернет управление быстрее, данные очистятся в фоне

Если ни одна из опций не указана, используется режим SYNC

info

INFO [section [section ...]]
поддерживается с версии 0.4.0

Возвращает информацию о сервере, подключенных клиентах, нагрузке на текущий узел и прочую статистику. Параметр section позволяет уточнить запрос, ограничив его нужной секцией. Доступные секции:

  • server
  • clients
  • memory
  • persistence
  • stats
  • replication
  • cpu
  • modules
  • cluster
  • keyspace
  • errorstats
  • commandstats
Образец вывода полного набора сведений
127.0.0.1:7379> info
# Server
radix_version:0.11.0
picodata_version:25.3.0-378-g04d0f509d
picodata_cluster_name:my_cluster
picodata_cluster_uuid:5f6319ee-9608-46f7-9a19-f6f75f0872c8
redis_version:8.0.0
redis_git_sha1:04ee91fd8c4fe13f80ad11c98c162d348058d12e
redis_git_dirty:1
redis_build_id:
redis_mode:standalone
os:Fedora Linux 6.15.7-200.fc42.x86_64 x86_64
arch_bits:64
monotonic_clock:POSIX clock_gettime with CLOCK_MONOTONIC
multiplexing_api:epoll
atomicvar_api:c11-builtin
gcc_version:rustc 1.89.0 (29483883e 2025-08-04)
process_id:2052921
process_supervised:no
run_id:0ae842fb90404f66a483a2285ccb9a77
tcp_port:7379
server_time_usec:1759236461265248000
uptime_in_seconds:29878
uptime_in_days:0
hz:3200
configured_hz:0
lru_clock:0
executable:/usr/local/bin/picodata
config_file:
io_threads_active:1

# Clients
connected_clients:1
cluster_connections:0
maxclients:0
client_recent_max_input_buffer:0
client_recent_max_output_buffer:8192
blocked_clients:0
tracking_clients:0
pubsub_clients:0
watching_clients:0
clients_in_timeout_table:0
total_watched_keys:0
total_blocking_keys:0
total_blocking_keys_on_nokey:0

# Memory
used_memory:113246208
used_memory_human:108.00M
used_memory_rss:177856512
used_memory_rss_human:169.62M
used_memory_peak:113246208
used_memory_peak_human:108.00M
used_memory_peak_perc:100.00
used_memory_overhead:79691776
used_memory_startup:113246208
used_memory_dataset:33554432
used_memory_dataset_perc:29.63
allocator_allocated:113246208
allocator_active:113246208
allocator_resident:177856512
total_system_memory:33285332992
total_system_memory_human:31.00G
used_memory_lua:19273117
used_memory_vm_eval:19273117
used_memory_lua_human:18.38M
used_memory_scripts_eval:0
number_of_cached_scripts:0
number_of_functions:0
number_of_libraries:0
used_memory_vm_functions:0
used_memory_vm_total:19273117
used_memory_vm_total_human:18.38M
used_memory_functions:0
used_memory_scripts:0
used_memory_scripts_human:0B
maxmemory:0
maxmemory_human:0B
maxmemory_policy:allkeys-lru
allocator_frag_ratio:50.00
allocator_frag_bytes:33554432
allocator_muzzy:0
allocator_rss_ratio:NaN
allocator_rss_bytes:0
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_total_replication_buffers:0
mem_fragmentation_ratio:NaN
mem_fragmentation_bytes:0
mem_clients_normal:16384
mem_allocator:slab
active_defrag_running:0
lazyfree_pending_objects:0
lazyfreed_objects:0
slab_info_items_size:16272
slab_info_items_used:8800
slab_info_items_used_ratio:54.08
slab_info_quota_size:67108864
slab_info_quota_used:33554432
slab_info_quota_used_ratio:50
slab_info_arena_size:33554432
slab_info_arena_used:860768
slab_info_arena_used_ratio:2.6

# Persistence
loading:0
async_loading:0

# Stats
total_connections_received:1
total_commands_processed:3
instantaneous_ops_per_sec:0
total_net_input_bytes:84
total_net_output_bytes:886
total_net_repl_input_bytes:0
total_net_repl_output_bytes:0
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
instantaneous_input_repl_kbps:0.00
instantaneous_output_repl_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0
unexpected_error_replies:0
total_error_replies:0
total_reads_processed:4
total_writes_processed:3
client_query_buffer_limit_disconnections:0
client_output_buffer_limit_disconnections:0
reply_buffer_expands:0
reply_buffer_shrinks:0

# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:f6547572-f3c0-4402-b72d-09af92b569be
master_replid2:f6547572-f3c0-4402-b72d-09af92b569be
master_repl_offset:35617
second_repl_offset:35617
repl_backlog_active:0
repl_backlog_size:0
repl_backlog_first_byte_offset: 0
repl_backlog_histlen:0

# CPU
used_cpu_sys:17.093780
used_cpu_user:39.019630
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000
used_cpu_sys_main_thread:15.096654
used_cpu_user_main_thread:38.009288

# Modules

# Errorstats

# Cluster
cluster_enabled:1

# Keyspace

# Commandstats
cmdstat_info:calls=1,usec=82000,usec_per_call=0,rejected_calls=0,failed_calls=0
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0

memory usage

MEMORY USAGE key [SAMPLES count]
поддерживается с версии 0.6.0

Показывает объем ОЗУ, занимаемый указанным ключом key. Параметр SAMPLES позволяет указать число дочерних элементов ключа (если такие имеются), объем которых также будет учтен. По умолчанию, значение SAMPLES равно 5. Для учета всех дочерних элементов следует указать SAMPLES 0.

Журнал изменений

0.11.0 - 2025-09-25

Новая функциональность

  • Implement master cond
  • Echo
  • Script flush

Исправления

  • Add zset commands into eval_ro ban
  • Script flush and echo comments/panic messages
  • Set log regarding any fails (adb41a0)
  • Make the "unknown command" error message match redis'

Документация

  • 📝 улучшим конфиг для генерации ченжлога на публику

Тестирование

  • Add script flush async test (24980d7)

Прочее

  • Curlf.sh теперь в $PATH
  • 👷 бенчмарки должны запускаться автоматически
  • 👷 добавим таймстемпы в логи CI
  • 👷 не надо бенчи на тегах запускать
  • 👷 улучшим вывод сообщение о релизе в телеграм
  • Benchmark some commands in ci
  • Update the benchmarks
  • Add ci benchmarks
  • Remove debug logging

0.10.0 - 2025-09-02

Новая функциональность

  • FLUSHDB должен очищать и ordered set спейсы
  • By default auth should be disabled
  • Remove chrono
  • Implement auth method
  • Implement mset
  • Add sentinel section to info
  • Introduce sentinel
  • Introduce ordered sets
  • Implement flush && flushall
  • Split RADIX_ADDR into listen/advertise
  • Add hmget/hmset, readonly, reset, unlink cmds

Исправления

  • Явно прописываем WAIT APPLIED LOCALLY для асинхронного FLUSHDB
  • Pubsub should work with su
  • Обрабатывать ошибку "доступа нет" от ядра
  • Remove key type if the last list element was popped
  • Do not block in scripts
  • Rename timeout func
  • Reschedule list lock remove action if there are pending actions
  • Use defer
  • Remove locks if command went into a timeout (only blpop rn)
  • Do not reverse values and scores for zscan, add tests for new behaviour
  • Zscan
  • Fail on decode bucket in `get_buckets`
  • Final fixes in auth method
  • Create type on zdiffstore
  • Use instance name for replica
  • Use the original redis error for evalsha
  • Close conn on client handle return
  • Use box.info.replication to check replication status in INFO REPLICATION
  • Use cas for patsub dml ops

Производительность

  • ⚡ move debug logs to debug and raise default level to info

Документация

  • Авторизация, описание и примеры использования
  • Исправим документацию по сентинелю
  • Добавим документацию конфигурацию клиента sentinel
  • Добавим скрипт для автоматического обновления списка поддерживаемых команд

Внутренние улучшения

  • Переименуем миграции, чтобы была нумерация последовательная
  • Stringify the field name of a stat for a subtraction warning

Тестирование

  • Перепишем тесты с шелла и пайпов на psql

Прочее

  • Remove docs from gamayun scan
  • Обновим список поддерживаемых команд
  • Review fix
  • Добавим лицензию в файлы
  • Удалим docker-compose.yml из анализа гамаюна
  • License update
  • Remove unneeded dirs for gamayun
  • 📄 опечатку исправим
  • Add license-check job
  • 📄 добавил лицензию на плагин
  • Do not build in ci pipeline, block tests, until linting is done

Build

  • Remove PIKE_DATA_DIR
  • Remove TARGET_ROOT, remove unused parameters in the cluster config
  • Pack old migrations, use new migrations locally
  • Update dependencies
  • Update the makefile to use new pike features

Deps

  • Обновим пикодату до 25.3.2

0.9.0 - 2025-06-25

Новая функциональность

  • Watch empty keys too
  • Add picodata's cluster_name and cluster_uuid to server info
  • Add a config option to enforce same-slot transactions

Исправления

  • Handle all commands in transactions, even if they have no bucket_id
  • TYPE должна возвращать "none" на ключах, которых нет
  • Don't panic on empty del cmd call
  • Conn dead lock while receive on drop

Производительность

  • Implement partial list deserialization

Внутренние улучшения

  • ⬆ запускаю cargo update для обновления токио
  • ⬆ обновляю picodata-plugin до 25.2.2
  • 🚨 будем в бенчмарке использовать crypto/rand вместо math/rand

Тестирование

  • 🩹 грязный трюк с прогоном теста на тире с 1 репликасетом
  • Увеличиваем таймаут в тесте пабсаба
  • 🩹 добавить небольшой таймаут после старта кластера, чтобы он закончил с ребалансом

Прочее

  • Fetch tags for gamayun
  • Останавливаю кластер перед тем, как забрать артефакты
  • Пробуем запустить тесты еще и на альте
  • Передадим прошлую версию в Гамаюн
  • ➖ удаляю неиспользуемые dev-dependencies
  • Wait for quality gate
  • Подставим версию 3 в Cargo.lock, ничего не сломается.
  • Удалим пароль для админского юзера из топологии
  • ⚰ удалим старые неиспользуемые луашки
  • 👷 добавляю Гамаюна

0.8.0 - 2025-06-04

Новая функциональность

  • Add more script telemetry

Исправления

  • Don't panic when downstream is not in the follow state or upstream's fiber is invalid

Документация

  • Add redis_compatibility user documentation

0.7.0 - 2025-05-28

Новая функциональность

  • Add deprecated set commands
  • Use non-blocking variants of commands in transactions
  • Implement more expire commands
  • Add expiretime
  • Make scripts transactional
  • Implement hvals

Исправления

  • Correctly close client connections on listener drop
  • 🐛 используем правильный запрос для получения информации о репликасете
  • Rust 1.87.0
  • Pop crash

Документация

  • Создаем тикет на обновление доков радикса, а не аргуса
  • Обновим пользовательскую документацию

Прочее

  • ⬆ обновим пикодатный плагин до 25.2.1
  • 🔨 обновим редис до 8.0 в кластере для тестов
  • 👷 при релизе создаем тикет в пикодату на обновление документации
  • 🐛 исправим пути файлов в релизе и приложим файл от бендера всегда

Build

  • ⬆ picodata 25.1.2

0.6.1 - 2025-04-28 0.6.1

Документация

  • 📝 обновим документацию

Прочее

  • 👷 вернем redos

0.6.0 - 2025-04-18

Новая функциональность

  • ✨ add functions to the redis object in lua scripts, add SCRIPT LOAD, SCRIPT EXISTS commands
  • Use custom radix string type
  • Use negative indexing for lists
  • Introduce transactions

Исправления

  • 🐛 удалим падающую миграцию
  • Command processed metric
  • Deadlocks for blocking commands on same bucket
  • 🐛 бакеты из другого тира всегда удаленные
  • 🧑‍💻 исправим упаковку релиза после мержа пики
  • 🧑‍💻 исправим сообщение
  • Mem stat
  • 🚑 fix the plugin file layout for pike
  • 🚑 provide replication_factor setting in picodata.yaml

Производительность

  • Try to optimize list op

Документация

  • Опишем конфигурацию миграций в пользовательской документации

Внутренние улучшения

  • 🔊 поправим сообщение для лога, в случае ошибки

Прочее

  • 🔥 удалить лишние файлы
  • Fix path to cargo2junit
  • Fix clippy format warnings
  • 🚨 rust 1.86.0
  • 👷 используем новые образа для упаковки
  • 👷 поправим бендера в мейне
  • 👷 добавим новые ОС в процесс сборки
  • 🔨 положим редис-кластер в репу с командой для запуска
  • 🩹 match the topology with the main branch's, move env variables to topology.toml

Build

  • Используем пайк 2.1.0 для билда
  • 🩹 сделал по два репликасета на каждый тир как и в оригинальном кластере
  • ⬆ introduce pike 2.0.0

0.5.2 - 2025-03-19

Прочее

  • 🧑‍💻 добавим отлаженного Бендера

0.5.1 - 2025-03-13

Исправления

  • 🩹 проверяем на андерфлоу при вычитании на статистике

Производительность

  • ⚡ если бакет локальный, то не ходить по рпц

Документация

  • 📝 исправим разметку в readme

Тестирование

  • 👷 исправим `make test_ci`, чтобы совпадало с реальностью
  • ✅ переведем бенч на кластерный клиент

Прочее

  • 👷 отсылаем нотификацию о релизе в спецчат в телеге

0.5.0 - 2025-03-06

Новая функциональность

  • ✨ реализуем новую команду `dbsize` для проверки состояния кластера
  • 🏗 используем CRC16/XMODEM для сегментирования
  • 👷 теперь паники будут в файловых логах
  • Allow multitier mode
  • Eval

Исправления

  • Deadlock on single mode for blocking ops
  • 🐛 cluster getkeysinslot исправлена
  • 🐛 используем UUID узла и репликасета в ответе на myid, myshardid
  • 🗃 fix migrations
  • Tests data cleanup
  • Eval ptr propagation
  • Eval ptr propagation
  • Parse timeout arguments to f64 not i64

Документация

  • 📝 обновим документацию для пользователя
  • 📝 ADR для мультитирного (многорядного?) радикса

Внутренние улучшения

  • ♻ зафиксируем, что работаем только с 16384 бакетами
  • ♻ вынесем `RedisBucketId` и `PicodataBucketId` в отдельные файлы
  • ♻ режим выполнения команды не отделим от бакета выполнения команды
  • ♻ типизируем айдишники бакетов
  • ♻ переименовываем ID в Name, потому что мы использовали имена
  • ♻ адаптировал запуск к запуску в нескольких тирах

Структура кода

  • 🚨 отформатировал код
  • ♻ поправил комменты и ошибку к методу insert_patsubscriber

Тестирование

  • ✅ исправил тест на cluster nodes

Прочее

  • 👷 переедем на образ с явно выставленным стабильным растом
  • 💚 укажем полный путь до cargo2junit, пока его нет в базовом образе
  • Add warn log for attempting sub from 0 value to stat macro
  • 👷 поправим пути к карго
  • 👷 попробуем новый базовый образ для пикодаты
  • Fix lints for rust 1.85
  • Rename radix nodes migration in manifest
  • Add deploy to EE repo (pdg)
  • 👷 временно разрешим тестам падать
  • ✅ запускаем тесты в ci теперь
  • 🧑‍💻 делаем удобный запуск кластера пикодаты
  • Rename replace_patsubscriber to insert_patsubscriber

Bench

  • List

Build

  • `make pico_radix_release` для запуска релизного радикса
  • ⬆ обновимся до пикодаты 25.1
  • На `pico_stop` убиваем пикодату из `PICODATA_BINARY_PATH`, а не просто `picodata`
  • 👷 можно запускать тесты как на CI, но локально

0.4.4 - 2025-01-13

Исправления

  • Lpop and rpop are used to panic

Прочее

  • Bump version
  • Fix lints for rust 1.84
  • Reduce unsafe usage
  • More benches
  • Stress test

Bench

  • Add benches for hash commands

0.4.3 - 2024-12-24

Новая функциональность

  • Implement incrs

0.4.1 - 2024-12-18

Новая функциональность

  • Implement writeln_crlf
  • Support expire for hash and list

Исправления

  • 🐛 исправим все-таки 62, надо возвращать в протоколе правильно ошибку
  • Declare dummy RUSAGE_THREAD for macos

Структура кода

  • Melformed -> malformed

Build

  • Добавим возможность запустить вторую копию

0.4.0 - 2024-12-10

Новая функциональность

  • 🔊 фильтрация логов для бедных
  • Добавил версию пикодаты в вывод `info server`
  • Implements cluster ids commands
  • Implement getkeysinslot
  • Implement cluster keyslot
  • Reduce size of persistence section
  • Use migrations for redis db creation
  • Implement keyspace info section
  • Implement replication info section
  • Change Astralinux from Orel to 1.7, 1.8 version added
  • Collect memory stat
  • Add cmdstat to info
  • Add client configuration. support input/output buffer shrinks, preallocate and reuse client output buffer
  • Add redis insight support
  • Use subkey in bucket calculation
  • Implement info stub
  • Implement missing list commands
  • Implement (b)lmpop
  • Implement (b)lmove
  • Implement rpush
  • Implement lpop and rpop
  • Implement basic list commands
  • Use borrowed string in a stored type

Исправления

  • RESP is using CRLF as line ending
  • Delete type on del call

Производительность

  • Мелкая оптимизация при создании хешсета
  • Fetch replicasets only for broadcasted commands
  • Increase performance for hset command

Документация

  • 📝 актуализируем документацию

Внутренние улучшения

  • ♻ сделали более явным клонирование
  • 🎨 разбил либу инфо на более мелкие и локализованные файлы
  • 🎨 перенес отдельные части `info` на уровень модуля этой команды
  • 🚨 удовлетворил требования нового стабильного раста

Прочее

  • 🔖 нарежем 0.3.0 релиз
  • Change type error message
  • Log improvements
  • 👷 используем шаблонный CI
  • Add perf results in commands docs

Build

  • 👷 поправил докерфайлы для установки всегда новой пикодаты
  • ➕ переводим плагин на picodata-plugin сдк

0.2.0 - 2024-10-04

Новая функциональность

  • Nonblocking gather executor
  • Write to pubsub locally if possible
  • Implement pubsub commands
  • Reuse user connection buffer in command decode

Исправления

  • 🩹 добавил скрипт по умолчанию для пикодаты

Производительность

  • ⚗ add scripts for running performance tests

Документация

  • 💬 save supported commands into docs
  • 🔨 good enough Readme

Структура кода

  • 🎨 добавил символ конца строки в конец моих файлов
  • 🎨 add checks module to make code readable

Прочее

  • ✨ Заливаем артефакты в нексус.
  • Init python tests
  • Rename redisproto to radix
  • Change name of package
  • 🔨 set up docker compose for every artifact

0.1.1 - 2024-09-13

Новая функциональность

  • Support single node mode

Исправления

  • Execute set on master
  • Replicaset decode
  • Connection fibers leak

Документация

  • 🔨 good enough Readme

Прочее

  • Add pack for all supported by picodata OS

0.1.0 - 2024-09-09

Новая функциональность

  • Support eval command without enabling it
  • Use bytes crate to use views in original clients buffer
  • Implement scan and hscan command
  • Redisproto

Исправления

  • Decode tests

Внутренние улучшения

  • Fix rust toolchain to stable
  • Clippy warnings

Прочее

  • Proper layout again, let's hope, it's final version.
  • Fix folder layout of artifacts.
  • Fix artifacts collection
  • Skip everything on main branch, because we use fast-forward only.
  • Main should build artifacts always
  • Init
  • Lints
  • Remove useless clusters dir
  • Basic Makefile