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

Radix

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

Picodata Enterprise

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

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

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

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

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

Соответствие версий Picodata и Radix

Версии плагина Radix требуют определённых версий СУБД Picodata. Ниже показана таблица совместимости версий:

Radix Picodata ФСТЭК-сертификат
0.9.0 25.2.2 ✅
0.14.1 25.5.7 (25.5.*)
1.0.6 26.1.5 (26.1.*)

См. также:

Установка

Развёртывание с помощью Ansible

При работе с Picodata в промышленной среде удобно использовать роль Picodata для Ansible. С её помощью вы можете развернуть кластер СУБД Picodata на нескольких узлах, в том числе, с поддержкой плагинов.

Для этого потребуется:

Конфигурация Radix для Ansible

Начиная с версии Picodata 26.1, плагин можно настроить, указав его параметры для тиров (блок tiers), которые, в свою очередь, привязаны к сервису плагина. Добавьте в инвентарный файл блок параметров, относящийся к Radix:

plugins:
  radix:                                                          # плагин
    path: '../files/radix_1.0.6-centos_el8.tar.gz'                # путь до пакета с Radix
    config: '../files/radix-config.yml'                           # путь до файла с настройками Radix
    services:
      radix:
        tiers:                                                    # список тиров, в которые устанавливается сервис radix
          - default:                                              # указано значение по умолчанию (default)
              listener:
                enabled: true
                listen: "0.0.0.0:73<INSTANCE_NUM>"
                advertise: "<INSTANCE_ADDR>:73<INSTANCE_NUM>"
                tls:
                  enabled: false

    migration_context:                                            # параметры миграции для Radix
      tier_for_db_0: 'default'
      tier_for_db_1: 'default'
      tier_for_db_2: 'default'
      tier_for_db_3: 'default'
      tier_for_db_4: 'default'
      tier_for_db_5: 'default'
      tier_for_db_6: 'default'
      tier_for_db_7: 'default'
      tier_for_db_8: 'default'
      tier_for_db_9: 'default'
      tier_for_db_10: 'default'
      tier_for_db_11: 'default'
      tier_for_db_12: 'default'
      tier_for_db_13: 'default'
      tier_for_db_14: 'default'
      tier_for_db_15: 'default'
      unlogged: 'UNLOGGED'

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

  • <INSTANCE_ADDR> — адрес сервера, на котором будет работать плагин
  • <INSTANCE_NUM> — номер инстанса на сервере в двухзначном формате (01, 02, 03 ...)
  • <INSTANCE_NUM3> — номер инстанса на сервере в трехзначном формате (001, 002, 003 ...)

Пример инвентарного файла

Пример инвентарного файла cluster.yml с указанием плагина Radix
all:
  vars:
    ansible_user: vagrant      # пользователь для ssh-доступа к серверам

    repo: 'https://download.picodata.io'  # репозиторий, откуда инсталлировать пакет Picodata

    cluster_name: 'demo'           # имя кластера
    admin_password: '123asdZXV'    # пароль пользователя admin

    default_bucket_count: 16384    # количество бакетов в каждом тире (для Radix требуется значение 16384)

    audit: false                   # состояние аудита (отключён)
    log_level: 'info'              # уровень отладки
    log_to: 'file'                 # вывод журнала в файлы (а не в journald)

    conf_dir: '/etc/picodata'         # директория для хранения конфигурационных файлов
    data_dir: '/var/lib/picodata'     # директория для хранения данных
    run_dir: '/var/run/picodata'      # директория для хранения sock-файлов
    log_dir: '/var/log/picodata'      # директория для журналов и файлов аудита
    share_dir: '/usr/share/picodata'  # директория для размещения служебных данных (плагинов)

    listen_address: '{{ ansible_fqdn }}'     # адрес, который будет слушать инстанс. Для IP указать {{ansible_default_ipv4.address}}
    pg_address: '{{ listen_address }}'       # адрес, по которому инстанс принимает подключения по PostgreSQL-протоколу

    first_bin_port: 13301     # начальный бинарный порт для первого инстанса
    first_http_port: 18001    # начальный http-порт для первого инстанса для веб-интерфейса
    first_pg_port: 15001      # начальный номер порта для PostgreSQL-протокола инстансов кластера

    tiers:                         # описание тиров
      arbiter:                     # имя тира
        replicaset_count: 1        # количество репликасетов
        replication_factor: 1      # фактор репликации
        config:
          memtx:
            memory: 64M            # количество памяти, выделяемое каждому инстансу тира
        host_groups:
          - ARBITERS               # целевая группа серверов для установки инстанса

      default:                     # имя тира
        replicaset_count: 3        # количество репликасетов
        replication_factor: 3      # фактор репликации
        bucket_count: 16384        # количество бакетов в тире
        config:
          memtx:
            memory: 71M            # количество памяти, выделяемое каждому инстансу тира
        host_groups:
          - STORAGES               # целевая группа серверов для установки инстанса

    db_config:                     # параметры конфигурации кластера (см. https://docs.picodata.io/picodata/stable/reference/db_config)
      governor_auto_offline_timeout: 30
      iproto_net_msg_max: 500
      memtx_checkpoint_count: 1
      memtx_checkpoint_interval: 7200

    plugins:
      radix:                                                        # плагин
        path: '../plugins/radix_1.0.6-1-ubuntu_noble.tar.gz'        # путь до пакета с Radix
        config: '../plugins/radix-config.yml'                       # путь до файла с настройками Radix
        services:
          radix:
            tiers:                                                  # список тиров, в которые устанавливается сервис radix
              - default                                             # указано значение по умолчанию (default)
            listener:
              enabled: true
              listen: "0.0.0.0:73<INSTANCE_NUM>"
              advertise: "<INSTANCE_ADDR>:73<INSTANCE_NUM>"
              tls:
                enabled: false
        migration_context:                                          # параметры миграции для Radix
          tier_for_db_0: 'default'
          tier_for_db_1: 'default'
          tier_for_db_2: 'default'
          tier_for_db_3: 'default'
          tier_for_db_4: 'default'
          tier_for_db_5: 'default'
          tier_for_db_6: 'default'
          tier_for_db_7: 'default'
          tier_for_db_8: 'default'
          tier_for_db_9: 'default'
          tier_for_db_10: 'default'
          tier_for_db_11: 'default'
          tier_for_db_12: 'default'
          tier_for_db_13: 'default'
          tier_for_db_14: 'default'
          tier_for_db_15: 'default'
          unlogged: 'UNLOGGED'
DC1:                                # имя датацентра (failure_domain)
  hosts:                            # серверы в датацентре
    server-1-1:                     # имя сервера в инвентарном файле
      ansible_host: '192.168.19.21' # IP-адрес или fqdn если не совпадает с предыдущей строкой
      host_group: 'STORAGES'        # определение целевой группы серверов для установки инстансов

    server-1-2:                     # имя сервера в инвентарном файле
      ansible_host: '192.168.19.22' # IP-адрес или fqdn если не совпадает с предыдущей строкой
      host_group: 'ARBITERS'        # определение целевой группы серверов для установки инстансов

DC2:                                # имя датацентра (failure_domain)
  hosts:                            # серверы в датацентре
    server-2-1:                     # имя сервера в инвентарном файле
      ansible_host: '192.168.20.21' # IP-адрес или fqdn если не совпадает с предыдущей строкой
      host_group: 'STORAGES'        # определение целевой группы серверов для установки инстансов

DC3:                                # имя датацентра (failure_domain)
  hosts:                            # серверы в датацентре
    server-3-1:                     # имя сервера в инвентарном файле
      ansible_host: '192.168.21.21' # IP-адрес или fqdn если не совпадает с предыдущей строкой
      host_group: 'STORAGES'        # определение целевой группы серверов для установки инстансов

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

Установите кластер Picodata с Radix, указав инвентарный файл и файл плейбука:

ansible-playbook -i hosts/cluster.yml playbooks/picodata.yml

См. также:

Развёртывание с помощью Docker

Доступны два образа:

  • <registry>/radix:1.0.6 — полноценный образ, готовый для использования в Kubernetes. Не имеет преднастроек.
  • <registry>/radix:1.0.6-standalone — образ с одиночным инстансом Picodata и предустановленным плагином Radix для быстрого ознакомления. Не предназначен для использования в производственной среде.

Примечание

Доступ к репозиторию с образами Picodata и Radix предоставляется по запросу для клиентов Picodata.

Запуск одиночного образа:

docker pull <registry>/radix:1.0.6-standalone
docker run --rm -p 7379:7379 -p 4327:4327 -p 5327:5327 <registry>/radix:1.0.6-standalone

После старта плагин готов к работе:

redis-cli -p 7379 ping

Открытые порты:

Порт Протокол
7379 Redis (RESP2)
4327 PostgreSQL
5327 HTTP

Развёртывание вручную

Порядок действий

Установка плагина Radix вручную имеет ряд особенностей. Процедура установки включает:

  • создание файла конфигурации для инстанса Picodata, где в разделе plugins будут указаны параметры Radix (пример).
  • установку у тиров, на которые предполагается развернуть плагин, 16384 бакетов. См. описание bucket_count и default_bucket_count, а также пример конфигурации
  • запуск инстанса Picodata с поддержкой плагинов (параметр --share-dir)
  • распаковку архива Radix в директорию, указанную на предыдущем шаге
  • подключение к административной консоли инстанса
  • выполнение SQL-команд для:
    • регистрации плагина
    • привязки его сервиса к тиру
    • миграции
    • включения плагина в кластере

Данные шаги более подробно описаны ниже.

См. также:

Файл конфигурации Picodata для Radix

Заполните файл конфигурации для инстанса Picodata, указав параметры плагина Radix. Используйте следующий шаблон:

cluster_config.yml: минимальная конфигурация кластера для запуска Radix
cluster:
  name: "demo_radix"
  tier:
    default:
      can_vote: true
      bucket_count: 16384
instance:
  instance_dir: data
  memtx:
    memory: 2000000000
  share_dir: plugins-files
  pgproto:
    enabled: true
    listen: "0.0.0.0:7000"
  iproto:
    enabled: true
    listen: "0.0.0.0:8000"
  http:
    enabled: true
    listen: "0.0.0.0:9000"
  log:
    level: info
    format: plain
    destination: null
  plugin:
    radix:
      service:
        radix:
          listener:
            enabled: true
            listen: "0.0.0.0:7379"
            advertise: "localhost:7379"
            tls:
              enabled: false

Запустите кластер с данным файлом конфигурации:

picodata run --config=cluster_config.yml

Подключитесь к кластеру и перейдите к следующим шагам.

Добавление плагина в кластере

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

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

CREATE PLUGIN radix 1.0.6;

Выполните указанные ниже шаги для того, чтобы включить плагин.

Добавление сервиса и установка параметров

На данном этапе выполните следующие шаги:

  • назначьте сервис плагина существующим тирам
  • задайте значения для 16 параметров migration_context.tier_for_db_N (по числу баз данных в Radix)
  • задайте значение для параметра unlogged

Пример для одного тира (default)

ALTER PLUGIN radix 1.0.6 ADD SERVICE radix TO TIER default;
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_0='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_1='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_2='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_3='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_4='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_5='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_6='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_7='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_8='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_9='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_10='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_11='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_12='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_13='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_14='default';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_15='default';

Пример для двух тиров (hot/cold)

ALTER PLUGIN radix 1.0.6 ADD SERVICE radix TO TIER hot;
ALTER PLUGIN radix 1.0.6 ADD SERVICE radix TO TIER cold;
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_0='hot';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_1='hot';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_2='hot';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_3='hot';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_4='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_5='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_6='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_7='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_8='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_9='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_10='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_11='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_12='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_13='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_14='cold';
ALTER PLUGIN radix 1.0.6 SET migration_context.tier_for_db_15='cold';

Параметр unlogged может принимать только два значения: '' (пустая строка) для включенного WAL (режим Radix до версии 1.0.0):

ALTER PLUGIN radix 1.0.6 SET migration_context.unlogged='' OPTION(TIMEOUT=1200);

или UNLOGGED для отключённого:

ALTER PLUGIN radix 1.0.6 SET migration_context.unlogged='UNLOGGED' OPTION(TIMEOUT=1200);

Запуск миграции

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

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

Включение плагина

Перед включением плагина убедитесь, что в кластере создан пользователь, указанный в параметре default_user_name секции authorization_mode файла конфигурации плагина (по умолчанию это default). Данному пользователю также следует выдать права для работы с объектами БД:

GRANT radix_reader TO default;
GRANT radix_writer TO default;

После этого включите плагин:

ALTER PLUGIN radix 1.0.6 ENABLE OPTION(TIMEOUT=30);

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

SELECT * FROM _pico_plugin;

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

Подключение и работа с Radix

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

redis-cli -p 7301

Для корректной работы redis-cli и других клиентских приложений настройте авторизацию в Radix.

Перенос данных между кластерами

Обновление с предыдущей версии Radix

Миграция с версий Radix, ниже чем 1.0.0, невозможна. Обновление Radix 1.x.x на более новую версию поддерживается и происходит аналогично установке Radix с той разницей, что если в кластере ранее была включена предыдущая версия плагина, то её следует сначала отключить и лишь затем включить новую версию. Пример:

ALTER PLUGIN radix 1.0.5 DISABLE OPTION(TIMEOUT=30);
ALTER PLUGIN radix 1.0.6 ENABLE OPTION(TIMEOUT=30);

Миграция с помощью radix-cli

Данный способ подходит для переноса данных как из Redis в Radix, так и между двумя кластерами Radix. Это наш собственный инструмент миграции данных, который доступен через утилиту radix-cli, поставляемую вместе с плагином. Инструмент учитывает особенности некоторых старых версий Radix.

Минимальный пример использования утилиты:

$ <picodata_share_dir>/radix/1.0.6/radix-cli migrate redis://localhost:7379/1 redis://localhost:7301/15
⠏ Подключено к источнику Radix 0.11.8 cluster (Picodata 25.3.8) Подключено к приёмнику Radix 1.0.6 cluster (Picodata 26.1.3-0-gc21b37df2)
[00:00:00] [========================================] 800/800 ключей
Перенесено 800 ключей за 329мс
Пропущено (существующих): 0
Пропущено (по TTL):       0
Не удалось: 0

Понижение версии плагина

При попытке откатиться на более старую версию плагина командой ALTER PLUGIN radix MIGRATE TO <старая_версия> Picodata может вернуть ошибку вида:

more migrations have already been applied (18) than are in the manifest (17)

Это происходит, когда текущая (новая) версия плагина содержит больше миграций, чем версия, на которую вы откатываетесь: список применённых миграций в Picodata общий для всех версий плагина, и проверка «применено больше, чем в манифесте целевой версии» срабатывает ещё до выполнения отката.

Утилита radix-cli migrate-down снимает это ограничение: она откатывает DOWN-секции «лишних» миграций (дельты между текущим набором и набором целевой версии) и удаляет их записи из служебной таблицы _pico_plugin_migration. После этого MIGRATE TO и последующий ENABLE проходят корректно.

Примечание

Целевая (старая) версия плагина должна быть уже установлена в кластере (ALTER PLUGIN radix ADD <старая_версия> ...) — из неё берётся авторитетный список миграций.

Порядок действий.

  1. Предпросмотр (по умолчанию — ничего не выполняется, только печатается план):

    radix-cli migrate-down \
      "postgres://admin:<пароль>@<хост>:<pg-порт>/picodata?sslmode=disable" \
      --to <старая_версия> \
      --plugin-dir <каталог share picodata, содержащий radix/<версия>/...>
    

  2. Внимательно проверьте план. DOWN-секция может содержать деструктивные операции (DROP TABLE), уничтожающие данные, добавленные новой версией. Откатываются только миграции дельты; общий префикс миграций не трогается, поэтому данные из него сохраняются.

  3. Выполните откат, добавив флаг --apply:

    radix-cli migrate-down \
      "postgres://admin:<пароль>@<хост>:<pg-порт>/picodata?sslmode=disable" \
      --to <старая_версия> --plugin-dir <...> --apply
    

  4. Завершите понижение версии с помощью следующих SQL-запросов:

    ALTER PLUGIN radix MIGRATE TO <старая_версия>;
    ALTER PLUGIN radix <старая_версия> ENABLE;
    

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

Настройка плагина

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

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

radix:
  clients: # ограничения клиентских соединений
    max_clients: 10000
    max_input_buffer_size: 1073741824
    max_output_buffer_size: 1073741824
  redis_compatibility: # совместимость с разными версиями Redis
    enabled_deprecated_commands: []
    enforce_one_slot_transactions: false
    push_result_includes_popped_items: true
    disable_scatter_gather: true
    include_radix_section_in_info_by_default: true
  cluster_mode: true
  sentinel_enabled: false
  max_defer_actions_per_iteration: 100
  authorization_mode: # авторизация
    state: enabled
    default_user_name: default
  eviction: # вытеснение ключей
    policy: volatile-ttl
    max_samples: 5
    lfu_decay_time: 60
    lfu_log_factor: 10
    watermark: 0.81
    tenacity: 10
  latency_monitor_threshold_ms: 0 # порог мониторинга задержек (мс), 0 = выключено
  slowlog_log_slower_than_us: 10000 # порог slowlog (мкс), -1 = выключено
  slowlog_max_len: 128 # макс. записей в slowlog
  debug: # отладка
    pico_commands_enabled: true

Пример команды, применяющей файл конфигурации:

picodata plugin configure --peer andy@127.0.0.1:3001 --service-password-file radix/secret.txt radix 1.0.6 radix/plugin_config.yaml

Авторизация и управление доступом

Radix поддерживает авторизацию под пользователем по умолчанию с заранее заданным паролем (аналог requirepass в Redis). Указать пользователя по умолчанию можно в секции authorization_mode в файле конфигурации плагина. Пользователь по умолчанию имеет полный набор прав на работу с объектами СУБД.

Внимание!

В версии Radix 1.0.5 имеются ограничения: для пользователя по умолчанию обязательно должен быть установлен пустой пароль.

Для управления правами пользователей в Radix применяется ACL (Access Control List) — система прав пользователей, в которой можно задать, к каким командам или категориям команд, ключам и каналам имеет доступ каждый пользователь.

Настройка пользователя происходит в два этапа:

  • создание пользователя на стороне Picodata и выдача необходимых прав на доступ к данным Radix
  • задание прав на стороне Radix с помощью системы ACL в Redis.

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

В Picodata доступны следующие роли:

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

Настройка пользователя для авторизации

В Radix 1.0.6 и новее необходимо указать пользователя и задать ему пароль, удовлетворяющий определённым требованиям. Укажите пользователя по умолчанию в секции authorization_mode в файле конфигурации плагина.

Внимание!

В версии Radix 1.0.5 пользователь по умолчанию без пароля обязан существовать, однако он может не иметь прав на доступ к каким-либо данным. См. раздел Пользователи с пустыми паролями.

Для указания пользователя по умолчанию используйте параметр default_user_name в конфигурации плагина. От имени этого пользователя будут выполняться команды без введенной команды авторизации (аналог пользователя default в Redis). Кроме того, если команда авторизации вызвана в формате формате AUTH <password> (например, при работе старых клиентов) будет выполнена попытка авторизации этого пользователя с паролем из команды.

По умолчанию значение default_user_name задано в файле manifest.yaml плагина как default и может быть переопределено в файле конфигурации плагина:

Фрагмент файла конфигурации Radix
services:
  - name: radix
    description: Redis protocol implementation
    default_configuration:
      ...
      authorization_mode:
        state: enabled
        default_user_name: default

Пользователь должен существовать в Picodata и иметь возможность использовать нужные роли:

CREATE USER IF NOT EXISTS default WITH PASSWORD 'S0mePass' OPTION(TIMEOUT=1200);
GRANT radix_reader TO default;
GRANT radix_writer TO default;

Теперь авторизация включена. Можно войти с помощью AUTH <password>:

$ redis-cli -p 7301
127.0.0.1:7301> set other-key 123
(error) NOAUTH Authentication required
127.0.0.1:7301> auth S0mePass
OK
127.0.0.1:7301> get other-key
(nil)
127.0.0.1:7301> set other-key 321
OK
127.0.0.1:7301> get other-key
"321"

И с помощью AUTH <user_name> <password>:

$ redis-cli -p 7301
127.0.0.1:7301> get some-key
(error) NOAUTH Authentication required
127.0.0.1:7301> auth default S0mePass
OK
127.0.0.1:7301> get some-key
(nil)
Пользователи с пустыми паролями

Для того, чтобы выполнять команды без предварительного вызова команды AUTH (аналог пользователя default в Redis без задания пароля в параметре requirepass его конфигурации), можно создать необходимого пользователя с пустым паролем с помощью следующей последовательности действий:

  1. Временно отключите политики безопасности пароля Picodata:

    ALTER SYSTEM SET auth_password_length_min TO 0;
    ALTER SYSTEM SET auth_password_enforce_uppercase TO FALSE;
    ALTER SYSTEM SET auth_password_enforce_lowercase TO FALSE;
    ALTER SYSTEM SET auth_password_enforce_digits TO FALSE;
    

  2. Создайте необходимого пользователя и задайте ему права использования нужных ролей (Radix должен быть установлен, но необязательно запущен):

    CREATE USER IF NOT EXISTS default WITH PASSWORD '';
    GRANT radix_reader TO default;
    GRANT radix_writer TO default;
    

  3. Верните политики безопасности пароля Picodata:

    ALTER SYSTEM SET auth_password_enforce_digits TO TRUE;
    ALTER SYSTEM SET auth_password_enforce_lowercase TO TRUE;
    ALTER SYSTEM SET auth_password_enforce_uppercase TO TRUE;
    ALTER SYSTEM SET auth_password_length_min TO 8;
    

Внимание!

В версии Radix 1.0.5 пользователю по умолчанию можно задать только пустой пароль. Для других пользователей такого ограничения нет.

Разделение доступов по БД

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 -p 7301
127.0.0.1:7301> acl setuser custom_user ~* &* +@all
OK
Изменение конфигурации Radix через SQL-запросы в Picodata
ALTER PLUGIN radix 1.0.6 SET radix.authorization_mode='{"state": "enabled", "default_user_name": "custom_user"}';
Использование LDAP
CREATE USER custom_user USING ldap;
GRANT radix_reader TO custom_user;
GRANT radix_writer TO custom_user;
ALTER PLUGIN radix 1.0.6 SET radix.authorization_mode = '{ "state": "enabled", "default_user_name": "custom_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"

Настройка адресов и TLS

Начиная с версии 1.0.0 настройка адресов производится в конфигурационном файле инстанса Picodata:

instance:
  plugin:
    radix:
      service:
        radix:
          listener:
            enabled: true
            listen: "0.0.0.0:7379"                 # Radix откроет сокет по указанному адресу и будет его слушать
            advertise: "localhost:7379"            # Radix будет использовать этот адрес в кластерных и sentinel-командах
            tls:
              enabled: false

Внимание!

Убедитесь, что на каждом узле кластера для слушающего сокета Radix указаны разные значения. Это необходимо для того, чтобы избежать конфликтов портов.

Пример с включённым TLS:

instance:
  plugin:
    radix:
      service:
        radix:
          listener:
            enabled: true
            listen: "0.0.0.0:7379"
            advertise: "localhost:7379"
            tls:
              enabled: true
              cert_file: tls/server.crt
              key_file: tls/server.key
              ca_file: tls/ca.crt

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

redis-cli --tls --cert tls/client.crt --key tls/client.key --cacert tls/ca.crt -p 7379 incr asdf2

Если вы хотите просто использовать TLS без клиентских сертификатов, то следует не указывать ca_file в файле конфигурации Picodata и указывать его в конфигурации клиента.

instance:
  plugin:
    radix:
      service:
        radix:
          listener:
            enabled: true
            listen: "0.0.0.0:7379"
            advertise: "localhost:7379"
            tls:
              enabled: true
              cert_file: tls/server.crt
              key_file: tls/server.key
              # ca_file: tls/ca.crt
redis-cli --tls --cacert tls/ca.crt -p 7379 incr asdf2

Описание конфигурации Radix

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. Устаревшие команды выключены по умолчанию. Для включения, добавьте их в файл конфигурации в формате ["command", "other"], где command и other — названия желаемых команд в нижнем регистре.

enforce_one_slot_transactions

Включает режим, в котором в транзакциях могут участвовать ключи только из одного слота (как и в Redis Cluster). Если он выключен — в транзакциях могут участвовать ключи из всего репликасета (между слотами), как в Redis Standalone. В этом случае вы можете эмулировать Redis Standalone, развернув Radix в составе одного репликасета.

Значение по умолчанию: false (выключено).

push_result_includes_popped_items

Включает режим, в котором элементы списков и сортированных множеств, отправившиеся в блокирующие команды, учитываются в выходных значениях команд LPUSH, RPUSH, ZADD, ZUNIONSTORE, ZRANGESTORE, ZDIFFSTORE и ZINTERSTORE.

Согласно документации Redis, команды, добавляющие элементы в списки и множества, должны возвращать количество, соответственно вставленных записей. Однако, если список/множество не содержит элементов, и при этом есть клиенты, которые ожидают вставки в него через блокирующие команды (BLPOP, например), то часть записей вставлены не будут, а вместо этого возвратятся этим клиентам — Radix вернёт только количество действительно вставленных элементов. Если нужно поведение как в Redis (то есть, необходимо вернуть и количество элементов, улетевших в BLPOP и аналогичные команды), выставите эту настройку в true.

disable_scatter_gather

Отключает режим опроса кластера для следующих команд:

  • Очищение базы данных: FLUSH, FLUSHALL, FLUSHDB SCRIPT FLUSH.
  • Информация о ключах: DBSIZE, KEYS, SCAN.
  • PUBSUB: PUBSUB CHANNELS, PUBSUB NUMSUB.

То есть при выставлении disable_scatter_gather = true, команда исполняется только на одном узле как в Redis Cluster, а при disable_scatter_gather = false по всем данным как в Redis Standalone, даже если Radix запущен на нескольких репликасетах.

По умолчанию - true.

include_radix_section_in_info_by_default

Добавляет секцию "Radix" в команду INFO с информацией о плагине и Picodata. Пример:

127.0.0.1:7298> info
# Server
redis_version:8.0.0
redis_git_sha1:715333fcf2a9f469566c029c1751699959e8706c
... # остальные поля и секции

# Radix
radix_version:1.0.5
picodata_version:26.1.2
picodata_cluster_name:radix
picodata_cluster_uuid:e0d4ede1-422a-4e5e-a0e5-e4d53ef5e37e
picodata_instance_name:default_1_1
picodata_instance_uuid:98f35dae-1cb5-4ba8-a5c3-fbb369b4fdc2
slab_info_items_size:16272
slab_info_items_used:160
slab_info_items_used_ratio:0.98
slab_info_quota_size:2000000000
slab_info_quota_used:33554432
slab_info_quota_used_ratio:1.68
slab_info_arena_size:33554432
slab_info_arena_used:311456
slab_info_arena_used_ratio:0.9

Значение по умолчанию - true.

cluster_mode

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

sentinel_enabled

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

В приложении требуется прописать адреса Radix в качестве адресов Sentinel. В качестве service_name укажите имена репликасетов, на которых развёрнут Radix (например, если в кластере 1 репликасет на тире default, то по умолчанию имя репликасета будет default_1). В качестве адреса Sentinel укажите адрес любого инстанса Radix.

Для примера, если в кластере нескольких тиров, а Radix развёрнут на тирах hot с двумя репликасетами и cold — с четырьмя, то получится такая топология:

# вариант топологии 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

Следует указывать названия service_name и адреса из одного тира. Если использовать в качестве адреса для Sentinel адрес реплики из другого тира, то такая конфигурация не будет работать.

max_defer_actions_per_iteration

Максимальное количество действий, которые модуль обработки TTL будет выполнять за одну итерацию. По умолчанию — 100.

authorization_mode

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

  • state — параметр, отвечающий за режим авторизации. Возможные значения:
    • disabled — авторизация выключена. Начиная с версии 1.0.5 это значение является устаревшим и не позволяет запустить Radix.
    • enabled — авторизация включена (значение по умолчанию). Для доступа нужно авторизоваться с помощью команды AUTH
  • default_user_name — имя пользователя по умолчанию. Значение по умолчанию — default. См. подробнее.
  • aclfile — Опциональное поле, указывающее расположение файла для команд ACL SAVE и ACL LOAD. Если поле не указано, то вызов этих команд завершится с ошибкой. Путь до файла считается относительно директории, в которой был запущен процесс picodata (не от instance-dir). Для удобства рекомендуется использовать полный путь до файла. В отличие от Redis Cluster, в Radix достаточно иметь данный файл на одном узле, а загруженные права хранятся в кластере в одном экземпляре (загрузив aclfile на одном узле, пользователи и их права будут одинаковы на всем кластере).

eviction

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

По умолчанию не задано, то есть выключено.

policy

Возможные стратегии вытеснения:

  • noeviction — вытеснение выключено
  • volatile-* — могут быть вытеснены только ключи с TTL:
    • volatile-lru — вытесняются наиболее давно использованные
    • volatile-lfu — вытесняются наименее часто используемые
    • volatile-random — вытесняются случайные
    • volatile-ttl — вытесняются с наименьшим TTL
  • allkeys-* — могут быть вытеснены любые ключи:
    • allkeys-lru — вытесняются наиболее давно использованные
    • allkeys-lfu — вытесняются наименее часто используемые
    • allkeys-random — вытесняются случайные

max_samples

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

По умолчанию равен 5.

lfu_decay_time

Период затухания счётчика использования ключа в минутах. Чем больше значение параметра, тем медленнее уменьшается счётчик.

По умолчанию равен 60, то есть каждый час счётчик использования уменьшается на единицу.

lfu_log_factor

Определяет, насколько медленно будет расти счётчик использования. Чем больше значение параметра, тем медленнее увеличивается счётчик.

По умолчанию равен 10, то есть счётчик использования увеличивается на единицу каждые 10 доступов к ключу.

watermark

Уровень квоты памяти, при достижении которого начинает работать вытеснение. Например, если memtx.memory выставлен в 100 МБ и watermark в 0.75, то вытеснение работает, когда данные занимают более 75 МБ.

По умолчанию параметр равен 0.81 (если у Picodata arena_used_ratio > 0.9 и items_used_ratio > 0.9, то она находится в состоянии нехватки памяти).

tenacity

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

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

Значение tenacity Поведение
0 Вытеснение происходит только в фоне
10 Переход в работу в фоне после 500 миллисекунд
50 Переход в работу в фоне после 134 секунд
70 Переход в работу в фоне после 36 минут
100 Вытеснение происходит синхронно

Формула расчета: $$ f(t) = \begin{cases} 50t, & \text{если } 0 \le t \le 10, \\ 500 \times 1.15^{\,t-10}, & \text{если } 11 \le t \le 99, \\ +\infty, & \text{если } t = 100. \end{cases} $$

latency_monitor_threshold_ms

Порог мониторинга задержек в миллисекундах. События, длительность которых превышает данный порог, записываются в историю задержек и доступны через команды LATENCY LATEST, LATENCY HISTORY, LATENCY GRAPH и сбрасываются командой LATENCY RESET.

Установите 0 для отключения мониторинга задержек.

По умолчанию — 0 (отключено).

Команда LATENCY HISTOGRAM строит гистограмму задержек по статистике каждой команды и работает независимо от этого порога.

ALTER PLUGIN radix 1.0.6 SET radix.latency_monitor_threshold_ms = '1';

slowlog_log_slower_than_us

Порог записи в slowlog в микросекундах. Команды, выполняющиеся дольше указанного времени, записываются в slowlog и доступны через семейство команд SLOWLOG (SLOWLOG GET, SLOWLOG LEN, SLOWLOG RESET).

  • Установите 0 для записи каждой команды.
  • Установите -1 для полного отключения slowlog.

По умолчанию — 10000 (10 миллисекунд).

ALTER PLUGIN radix 1.0.6 SET radix.slowlog_log_slower_than_us = '0';

slowlog_max_len

Максимальное количество записей в slowlog. При превышении лимита самые старые записи удаляются.

По умолчанию — 128.

ALTER PLUGIN radix 1.0.6 SET radix.slowlog_max_len = '256';

debug

Настройки для отладки работы Radix и Picodata.

pico_commands_enabled

Включает семейство команд PICO:

  • PICO ENABLE — включить команды PICO LUA и PICO SQL для текущего соединения (выключены по умолчанию)
  • PICO STATUS — получить статус доступности команд PICO LUA и PICO SQL для текущего соединения
  • PICO DISABLE — выключить команды PICO LUA и PICO SQL для текущего соединения
  • PICO LUA <script> — исполнить Lua-скрипт в Picodata.
  • PICO SQL <script> — исполнить SQL-скрипт в Picodata.

Все команды семейства входят в категории debug, slow и dangerous, причём доступ соответствует выданным правам авторизованного пользователя.

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

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

Управление доступом в Radix реализовано с помощью списков контроля доступа (access control lists, ACL). С их помощью администратор может ограничить доступ пользователей к определённым ключам и их значениям. Команды сгруппированы в категории, что позволяет назначать пользователям сразу нужные наборы прав доступа.

Реализованные в Radix ACL-команды и их категории описаны ниже.

Категории ACL

В Radix используются следующие ACL-категории для команд:

  • admin — административные команды. Пользователям, работающим с данными БД, они обычно не нужны
  • blocking — команды, блокирующие выполнение других команд
  • dangerous — потенциально опасные команды (с точки зрения сохранности данных)
  • connection — команды, имеющие отношение к управлению соединениями
  • fast — команды быстрого выполнения, на скорость которых не влияет количество элементов, хранящихся в целевом ключе
  • hash — все команды, имеющие отношение к работе с хэшем
  • keyspace — команды, работающие со значениями ключей
  • list — команды для работы со списками
  • pico — команды, специфичные для Picodata
  • pubsub — все команды, имеющие отношение к pubsub
  • read — команды, читающие данные из ключей
  • set — команды, устанавливающие значения
  • scripting — команды для работы со скриптами
  • slow — команды медленного выполнения
  • sortedset — команды, имеющие отношение к сортированным множествам
  • string — команды, работающие со строковыми данными
  • transaction — команды для работы с транзакциями
  • write — команды, записывающие данные в ключи

acl cat

ACL CAT [category]
поддерживается с версии 1.0.0 slow

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

acl dryrun

ACL DRYRUN username command [arg [arg ...]]
поддерживается с версии 1.0.0 admin dangerous slow

Симулирует выполнение команды пользователем. DRYRUN удобен для проверки того, что у пользователя достаточно прав на выполнение указанной команды.

Пример:

> ACL SETUSER VIRGINIA +SET ~*
"OK"
> ACL DRYRUN VIRGINIA SET foo bar
"OK"
> ACL DRYRUN VIRGINIA GET foo
"User VIRGINIA has no permissions to run the 'get' command

acl getuser

ACL GETUSER username
поддерживается с версии 1.0.0 admin dangerous slow

Возвращает все доступные ACL-данные для указанного пользователя (флаги, хэши паролей, разрешённые команды и т.д.).

acl list

ACL LIST
поддерживается с версии 1.0.0 admin dangerous slow

Возвращает список всех пользователей (кроме служебных guest/admin/pico-service) с сопоставленными им правилами. Если для пользователя ACL не заданы, то используются правила по умолчанию (запрещены все команды/ключи/каналы).

acl load

ACL LOAD
поддерживается с версии 1.0.0 admin dangerous slow

Загружает на сервер Radix набор ACL-правил, определённых в файле aclfile (задаётся в разделе authorization_mode конфигурации Radix). Существующие правила ACL переписываются (сначала удаляются все заданные правила ACL, а потом загружаются из файла).

acl log

ACL LOG [count | RESET]
поддерживается с версии 1.0.0 admin dangerous slow

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

  • ошибки авторизации (например, при AUTH)
  • ошибки выполнения команд из-за недостатка прав

Недавние записи находятся в начале списка. Параметр count позволяет указать количество выводимых записей (по умолчанию 10). Параметр RESET позволяет очистить журнал.

acl save

ACL SAVE
поддерживается с версии 1.0.0 admin dangerous slow

Записывает текущие ACL-правила на сервере Radix в aclfile. Для работы этой команды необходимо настроить расположение файла aclfile задаётся в разделе authorization_mode конфигурации Radix).

acl setuser

ACL SETUSER username [rule [rule ...]]
поддерживается с версии 1.0.0 admin dangerous slow

Задаёт набор правил ACL для существующего пользователя Picodata. Если пользователю ранее были заданы правила ACL, то данная команда добавит новые правила к существующему списку, не затирая его.

Пример:

ACL SETUSER virginia on allkeys +set
ACL SETUSER virginia +get
> ACL LIST
1) "user virginia on -@allkeys +set +get"

Список доступных правил для работы с данными:

  • ~<pattern> — добавляет указанный шаблон ключа в список шаблонов ключей, доступных пользователю. Это предоставляет права как на чтение, так и на запись для ключей, соответствующих данному шаблону. Можно добавить несколько шаблонов ключей для одного и того же пользователя. Пример: ~objects:*
  • %R~<pattern> — добавляет указанный шаблон ключа для чтения. Он работает аналогично обычному шаблону ключа, но предоставляет права только на чтение из ключей, соответствующих данному шаблону
  • %W~<pattern> — добавляет указанный шаблон записи ключей. Он работает аналогично обычному шаблону ключей, но предоставляет разрешение на запись только в те ключи, которые соответствуют данному шаблону
  • %RW~<pattern> — аналогичен ~<pattern>
  • allkeys — предоставляет доступ ко всем ключам, аналогичен ~*
  • resetkeys — очищает все шаблоны ключей, ранее назначенные пользователю
  • &<pattern> — добавляет указанный шаблон в стиле glob в список шаблонов каналов Pub/Sub, доступных пользователю (подробнее)
  • allchannels — предоставляет доступ ко всем каналам Pub/Sub, аналогичен &*
  • resetchannels — очищает все шаблоны каналов, ранее назначенные пользователю
  • +<command> — добавляет команду в список команд, которые пользователь может выполнять. Может использоваться с символом | для разрешения подкоманд (например, +config|get)
  • +@<category> — добавляет категорию команд в список команд, которые пользователь может выполнять (например, +@string). Список категорий доступен по команде ACL CAT
  • allcommands — добавляет все команды, имеющиеся на сервере, включая будущие команды, загружаемые через модули, для выполнения этим пользователем. Аналогичен +@all
  • -<command> — удаляет команду из списка команд, которые пользователь может выполнять. Может использоваться с символом | для блокирования подкоманд (например, -config|set)
  • -@<category> — действует противоположно +<category>, то есть, удаляет все команды категории из списка команд, которые пользователь может выполнять.
  • nocommands — удаляет все права пользователя, лишая его возможности что-либо выполнять. Аналогичен -@all
  • (<rule list>) — создаёт новый селектор для сопоставления правил. Селекторы применяются после прав пользователя и в том порядке, в котором они перечислены. Если команда соответствует либо правам пользователя, либо любому селектору, она разрешена
  • clearselectors — удаляет все селекторы, привязанные к пользователю
  • reset — удаляет все правила работы с данными у пользователя. Они устанавливаются в состояние «выключено»: без паролей, без возможности выполнять какие-либо команды и без доступа к каким-либо ключам

acl users

ACL USERS
поддерживается с версии 1.0.0 admin dangerous slow

Выводит список пользователей и их ACL.

acl whoami

ACL WHOAMI
поддерживается с версии 1.0.0 slow

Выводит список текущего (прошедшего авторизацию) пользователя.

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

cluster getkeysinslot

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

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

cluster info

CLUSTER INFO
поддерживается с версии 0.12.0 slow

Возвращает основной набор параметров кластера. Пример:

127.0.0.1:7301> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:8
cluster_size:4
cluster_current_epoch:2
cluster_my_epoch:2
cluster_stats_messages_ping_sent:0
cluster_stats_messages_pong_sent:0
cluster_stats_messages_sent:0
cluster_stats_messages_ping_received:0
cluster_stats_messages_pong_received:0
cluster_stats_messages_meet_received:0
cluster_stats_messages_fail_received:0
cluster_stats_messages_received:0

cluster keyslot

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

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

cluster myid

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

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

cluster myshardid

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

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

cluster nodes

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

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

cluster replicas

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

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

cluster shards

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

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

cluster slots

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

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

echo

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

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

ping

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

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

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

quit

QUIT
поддерживается с версии 0.13.0 connection fast

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

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["quit" ] }';

readonly

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

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

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

auth

AUTH password
поддерживается с версии 0.10.0 connection fast

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

auth username password

Выполняет аутентификацию выбранного пользователя.

client getname

CLIENT GETNAME
поддерживается с версии 1.0.5 connection slow

Возвращает имя соединения, заданное командой CLIENT SETNAME. Если имя не было задано, будет возвращено значение nil.

client help

CLIENT HELP
поддерживается с версии 1.0.5 connection slow

Возвращает список поддерживаемых команд группы CLIENT ... и их краткое описание.

client id

CLIENT ID
поддерживается с версии 1.0.5 connection slow

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

  • получение одного и того же идентификатора в разных запросах гарантирует, что соединение не обрывалось между ними
  • большее значение идентификатора гарантирует более позднее время создания соединения

client info

CLIENT INFO
поддерживается с версии 1.0.5 connection slow

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

client kill

CLIENT KILL <ip:port | <[ID client-id] | [TYPE <NORMAL | MASTER |
  SLAVE | REPLICA | PUBSUB>] | [USER username] | [ADDR ip:port] |
  [LADDR ip:port] | [SKIPME <YES | NO>] | [MAXAGE maxage]
  [[ID client-id] | [TYPE <NORMAL | MASTER | SLAVE | REPLICA |
  PUBSUB>] | [USER username] | [ADDR ip:port] | [LADDR ip:port] |
  [SKIPME <YES | NO>] | [MAXAGE maxage] ...]>>
поддерживается с версии 1.0.5 admin connection dangerous slow

Закрывает указанное клиентское соединение. Команда поддерживает два формата. Старый формат:

CLIENT KILL ip:port

Значение ip:port должно совпадать с одной из строк, которые возвращает команда CLIENT LIST в поле addr.

Новый формат:

CLIENT KILL <filter> <value> ... ... <filter> <value>

В новом формате можно закрывать клиентские соединения по разным атрибутам, а не только по адресу. Можно указать несколько фильтров одновременно. В этом случае они объединяются логическим AND.

CLIENT KILL ADDR 127.0.0.1:12345 TYPE PUBSUB

Этот запрос закроет только клиентское соединение типа pubsub с указанным адресом. При использовании нового формата команда возвращает не OK или ошибку, а количество закрытых клиентских соединений. Это число может быть равно нулю.

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

  • ip:port — закрывает клиентское соединение по указанному адресу. Это устаревший формат с одним аргументом.
  • ID client-id — закрывает только клиентское соединение с указанным уникальным идентификатором.
  • TYPE NORMAL | MASTER | SLAVE | REPLICA | PUBSUB — закрывает только клиентские соединения указанного типа.
  • USER username — закрывает только клиентские соединения, аутентифицированные как указанный пользователь ACL.
  • ADDR ip:port — закрывает только клиентские соединения с указанного адреса.
  • LADDR ip:port — закрывает только клиентские соединения, подключенные к указанному локальному адресу сервера.
  • SKIPME YES | NO — определяет, нужно ли пропускать клиента, который вызвал команду. Значение YES используется по умолчанию и пропускает вызывающего клиента. Значение NO разрешает закрыть и его соединение.
  • MAXAGE maxage — закрывает только клиентские соединения, возраст которых превышает указанное значение в секундах.

client list

CLIENT LIST [TYPE <NORMAL | MASTER | REPLICA | PUBSUB>]
  [ID client-id [client-id ...]]
поддерживается с версии 1.0.5 admin connection dangerous slow

Выводит список клиентских соединений.

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

  • TYPE NORMAL | MASTER | REPLICA | PUBSUB — выводит только клиентские соединения указанного типа.
  • ID client-id [client-id ...] — выводит только клиентские соединения с указанными идентификаторами.

Подробности:

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

  • id — уникальный 64-битный идентификатор клиента
  • addr — адрес и порт клиента
  • name — имя, заданное клиентом командой CLIENT SETNAME
  • age — общее время существования соединения в секундах
  • idle — время простоя соединения в секундах
  • flags — флаги клиента (см. ниже)
  • db — идентификатор текущей базы данных
  • sub — количество подписок на каналы
  • psub — количество подписок по шаблону
  • ssub — количество подписок на шардированные каналы
  • multi — количество команд в контексте MULTI/EXEC
  • user — имя пользователя, под которым клиент аутентифицирован
  • lib-name — имя используемой клиентской библиотеки
  • lib-ver — версия клиентской библиотеки

Флаги клиента могут быть скомбинированы из следующих значений:

  • b — клиент ожидает в блокирующей операции
  • N — специальные флаги не установлены
  • P — клиент является подписчиком Pub/Sub
  • r — клиент работает в режиме readonly при обращении к узлу кластера
  • S — клиент является соединением реплики с этим экземпляром
  • t — у клиента включено отслеживание ключей для клиентского кэширования

client no-evict

CLIENT NO-EVICT <ON | OFF>
поддерживается с версии 1.0.5 admin connection dangerous slow

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

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

  • ON — включает защиту текущего соединения от вытеснения.
  • OFF — выключает защиту текущего соединения от вытеснения.

client no-touch

CLIENT NO-TOUCH <ON | OFF>
поддерживается с версии 1.0.5 connection slow

Управляет тем, будут ли команды текущего клиента изменять статистику LRU/LFU для ключей, к которым обращаются.

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

  • ON — отключает обновление времени последнего обращения к ключам и счетчика LFU для команд этого соединения. Исключение составляет команда TOUCH.
  • OFF — включает обычное обновление статистики LRU/LFU для команд этого соединения.

client pause

CLIENT PAUSE timeout [WRITE | ALL]
поддерживается с версии 1.0.5 admin connection dangerous slow

Приостанавливает обработку команд клиентов на указанное время в миллисекундах.

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

  • timeout — время приостановки клиентов в миллисекундах.
  • ALL — режим по умолчанию, при котором блокируются все команды клиентов.
  • WRITE — режим, при котором клиенты блокируются только при попытке выполнить команду записи.

Подробности:

  • Команда останавливает обработку ожидающих команд обычных клиентов и клиентов Pub/Sub для указанного режима. Взаимодействие с репликами продолжается в обычном режиме. Клиент формально считается приостановленным, когда пытается выполнить команду, поэтому для неактивных клиентов сервер не выполняет дополнительную работу.
  • Команда как можно быстрее возвращает OK вызывающему клиенту, поэтому само выполнение CLIENT PAUSE не приостанавливается.
  • Когда указанное время истекает, все клиенты разблокируются, и сервер начинает обрабатывать команды, накопленные в буферах запросов во время паузы.
  • В режиме WRITE команды EVAL и EVALSHA блокируют клиента для всех скриптов. Команды PUBLISH и PFCOUNT также блокируют клиента. Для команды WAIT подтверждения задерживаются, поэтому она выглядит заблокированной.
  • Команда полезна для управляемого переключения клиентов с одного экземпляра Redis на другой. Например, при обновлении экземпляра администратор может приостановить клиентов с помощью CLIENT PAUSE, подождать, пока реплики обработают последний поток репликации от мастера, повысить одну из реплик до мастера и перенастроить клиентов на новый мастер.
  • Режим WRITE останавливает трафик репликации, может быть отменен командой CLIENT UNPAUSE и позволяет перенастроить старый мастер без риска принять записи после failover.

client reply

CLIENT REPLY <ON | OFF | SKIP>
поддерживается с версии 1.0.5 connection slow

Управляет тем, будет ли сервер отправлять ответы на команды клиента. Это полезно, когда клиент отправляет команды в режиме fire-and-forget, выполняет массовую загрузку данных или получает постоянный поток новых данных в сценариях кэширования.

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

  • ON — режим по умолчанию: сервер возвращает ответ на каждую команду.
  • OFF — сервер не отправляет ответы на команды клиента.
  • SKIP — сервер пропускает ответ только для команды, которая идет сразу после CLIENT REPLY SKIP.

client setinfo

CLIENT SETINFO <LIB-NAME libname | LIB-VER libver>
поддерживается с версии 1.0.5 connection slow

Задает информационные атрибуты текущего соединения. Эти атрибуты отображаются в выводе команд CLIENT LIST и CLIENT INFO. Клиентские библиотеки обычно отправляют эту команду в pipeline после аутентификации на каждом соединении и игнорируют ошибки, потому что могут быть подключены к серверу, который не поддерживает такие атрибуты.

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

  • LIB-NAME libname — задает имя клиентской библиотеки для текущего соединения.
  • LIB-VER libver — задает версию клиентской библиотеки для текущего соединения.

Подробности:

  • Длина этих атрибутов не ограничена, но в них нельзя использовать пробелы, переводы строк и другие непечатаемые символы, которые нарушили бы формат ответа CLIENT LIST.
  • Официальные клиентские библиотеки могут расширять lib-name пользовательским суффиксом, чтобы передавать дополнительную информацию о клиенте. Например, высокоуровневые библиотеки могут сообщать свою версию, а итоговое значение lib-name может выглядеть как jedis(redis-om-spring_v1.0.0). Фигурные скобки используются как разделители пользовательского суффикса, поэтому их не стоит использовать внутри самого суффикса.
  • Для пользовательских суффиксов сторонних библиотек рекомендуется формат (?<custom-name>[ -~]+)[ -~]v(?<custom-version>[\d\.]+). Несколько суффиксов можно разделять символом ;.
  • Команда RESET не очищает эти атрибуты.

client setname

CLIENT SETNAME connection-name
поддерживается с версии 1.0.5 connection slow

Задает имя для текущего соединения.

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

  • connection-name — имя, которое нужно назначить текущему соединению.

Подробности:

  • Назначенное имя отображается в выводе CLIENT LIST, чтобы можно было определить клиента, открывшего конкретное соединение.
  • Например, если Redis используется для реализации очереди, производители и потребители сообщений могут задавать имя соединения в соответствии со своей ролью.
  • Длина имени ограничена только обычным пределом строк Redis, но в имени соединения нельзя использовать пробелы, потому что это нарушит формат ответа CLIENT LIST.
  • Чтобы полностью удалить имя соединения, задайте пустую строку. Пустая строка не является допустимым именем соединения и используется специально для удаления имени.
  • Имя соединения можно проверить командой CLIENT GETNAME. Новые соединения создаются без имени.
  • Имена соединений помогают отлаживать утечки соединений, вызванные ошибками в приложении.

client unblock

CLIENT UNBLOCK client-id [TIMEOUT | ERROR]
поддерживается с версии 1.0.5 admin connection dangerous slow

Разблокирует клиент, который заблокирован блокирующей операцией, например BRPOP или WAIT.

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

  • client-id — идентификатор клиента, которого нужно разблокировать.
  • TIMEOUT — поведение по умолчанию: разблокировать клиента так, как если бы истек таймаут заблокированной команды.
  • ERROR — разблокировать клиента с ошибкой -UNBLOCKED.

Подробности:

  • Используйте эту команду, когда нужно отслеживать много ключей ограниченным числом соединений. Если процессу-потребителю нужно начать отслеживать еще один поток (stream), можно не открывать новое соединение: разблокируйте одно из соединений в пуле, добавьте новый ключ и снова выполните блокирующую команду.
  • Для такого сценария создайте дополнительное управляющее соединение, которое будет отправлять CLIENT UNBLOCK при необходимости. Перед запуском блокирующей операции на каждом отслеживаемом соединении выполните CLIENT ID, чтобы получить идентификатор этого соединения. Когда нужно добавить или удалить ключ, используйте управляющее соединение, чтобы отправить CLIENT UNBLOCK для соединения с блокирующей командой. Блокирующая команда вернется, после чего ее можно выполнить снова с обновленным набором ключей.

Пример:

-- Соединение A (блокирующее соединение):
CLIENT ID
2934
BRPOP key1 key2 key3 0
-- клиент заблокирован

-- Нужно добавить новый ключ.

-- Соединение B (управляющее соединение):
CLIENT UNBLOCK 2934
1

-- Соединение A (блокирующее соединение):
-- BRPOP возвращает таймаут.
NULL
BRPOP key1 key2 key3 key4 0
-- клиент снова заблокирован

client unpause

CLIENT UNPAUSE
поддерживается с версии 1.0.5 admin connection dangerous slow

Возобновляет обработку команд для всех клиентов, которые были приостановлены командой CLIENT PAUSE.

hello

HELLO [protover [AUTH username password] [SETNAME clientname]]
поддерживается с версии 1.0.6 connection fast

Возвращает подробности о сервере и подключении. Параметр protover позволяет задать версию протокола RESP (2 или 3). На данный момент Radix поддерживает только версию 2. Параметр AUTH позволяет явно указать имя и пароль пользователя, под которым производится подключение. Параметр SETNAME позволяет задать имя клиента (аналогично команде CLIENT SETNAME).

reset

RESET
поддерживается с версии 0.10.0 connection fast

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

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

select

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

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

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

dbsize

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

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

del

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

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

exists

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

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

expire

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

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

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

expireat

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

Устанавливает срок жизни (таймаут) для ключа 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 fast keyspace read

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

keys

KEYS pattern
поддерживается с версии 0.1.0 dangerous keyspace read slow

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

Поддерживаются шаблоны в стиле 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 fast keyspace write

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

pexpire

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

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

pexpireat

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

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

pexpiretime

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

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

pttl

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

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

scan

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

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

ttl

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

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

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

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

type

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

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

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

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

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

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

Хэш-команды

hdel

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

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

hexists

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

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

hget

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

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

hgetall

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

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

hincrby

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

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

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

hkeys

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

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

hlen

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

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

hmget

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

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

hmset

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

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

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["hmset" ] }';

hscan

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

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

hset

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

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

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

hvals

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

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

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

sadd

SADD key member [member ...]
поддерживается с версии 0.13.0 fast set write

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

scard

SCARD key
поддерживается с версии 0.13.0 fast read set

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

sdiff

SDIFF key [key ...]
поддерживается с версии 0.13.0 read set slow

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

sdiffstore

SDIFFSTORE destination key [key ...]
поддерживается с версии 0.13.0 set slow write

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

Примеры:

127.0.0.1:7379> SADD key1 "a"
(integer) 1
127.0.0.1:7379> SADD key1 "b"
(integer) 1
127.0.0.1:7379> SADD key1 "c"
(integer) 1
127.0.0.1:7379> SADD key2 "c"
(integer) 1
127.0.0.1:7379> SADD key2 "d"
(integer) 1
127.0.0.1:7379> SADD key2 "e"
(integer) 1
127.0.0.1:7379> SDIFFSTORE key key1 key2
(integer) 2
127.0.0.1:7379> SMEMBERS key
1) "a"
2) "b"
127.0.0.1:7379>

sinter

SINTER key [key ...]
поддерживается с версии 0.13.0 read set slow

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

sintercard

SINTERCARD numkeys key [key ...] [LIMIT limit]
поддерживается с версии 0.13.0 read set slow

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

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

sinterstore

SINTERSTORE destination key [key ...]
поддерживается с версии 0.13.0 set slow write

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

Пример:

127.0.0.1:7379> SADD key1 "a"
(integer) 1
127.0.0.1:7379> SADD key1 "b"
(integer) 1
127.0.0.1:7379> SADD key1 "c"
(integer) 1
127.0.0.1:7379> SADD key2 "c"
(integer) 1
127.0.0.1:7379> SADD key2 "d"
(integer) 1
127.0.0.1:7379> SADD key2 "e"
(integer) 1
127.0.0.1:7379> SINTERSTORE key key1 key2
(integer) 1
127.0.0.1:7379> SMEMBERS key
1) "c"
127.0.0.1:7379>

sismember

SISMEMBER key member
поддерживается с версии 0.13.0 fast read set

Возвращает признак присутствия элемента в указанном множестве. В выводе будет 1 или 0, соответственно.

smembers

SMEMBERS key
поддерживается с версии 0.13.0 read set slow

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

smove

SMOVE source destination member
поддерживается с версии 0.13.0 fast set write

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

spop

SPOP key [count]
поддерживается с версии 0.13.0 fast set write

Извлекает один или несколько элементов (согласно числу, указанному в count), хранящихся в множестве по указанному ключу. Если count не указан, то по умолчанию команда извлечёт один элемент.

srandmember

SRANDMEMBER key [count]
поддерживается с версии 0.13.0 read set slow

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

srem

SREM key member [member ...]
поддерживается с версии 0.13.0 fast set write

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

sscan

SSCAN key cursor [MATCH pattern] [COUNT count]
поддерживается с версии 0.13.0 read set slow

См. SCAN

sunion

SUNION key [key ...]
поддерживается с версии 0.13.0 read set slow

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

sunionstore

SUNIONSTORE destination key [key ...]
поддерживается с версии 0.13.0 set slow write

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

Пример:

127.0.0.1:7379> SADD key1 "a"
(integer) 1
127.0.0.1:7379> SADD key1 "b"
(integer) 1
127.0.0.1:7379> SADD key1 "c"
(integer) 1
127.0.0.1:7379> SADD key2 "c"
(integer) 1
127.0.0.1:7379> SADD key2 "d"
(integer) 1
127.0.0.1:7379> SADD key2 "e"
(integer) 1
127.0.0.1:7379> SUNIONSTORE key key1 key2
(integer) 5
127.0.0.1:7379> SMEMBERS key
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"

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

bzmpop

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

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

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

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

bzpopmax

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

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

bzpopmin

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

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

zadd

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

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

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

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

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

zcard

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

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

zcount

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

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

zdiff

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

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

zdiffstore

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

Вычисляет разницу между первым и последующими сортированными множествами (хранящимися в соответствующих ключах 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 fast sortedset write

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

zinter

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

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

zintercard

ZINTERCARD numkeys key [key ...] [LIMIT limit]
поддерживается с версии 1.0.0 read slow sortedset

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

zinterstore

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

Вычисляет пересечение элементов из двух или более сортированных множеств, хранящихся по указанным ключам (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 fast read sortedset

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

zmpop

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

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

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

zmscore

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

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

zpopmax

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

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

zpopmin

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

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

zrandmember

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

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

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

zrange

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

Возвращает указанный набор элементов из сортированного множества, хранящегося по ключу 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"

zrangebylex

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

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

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["zrangebylex" ] }';

zrangebyscore

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

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

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["zrangebyscore" ] }';

zrangestore

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

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

zrank

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

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

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

zrem

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

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

zremrangebylex

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

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

zremrangebyrank

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

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

zremrangebyscore

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

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

zrevrange

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

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

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["zrevrange" ] }';

zrevrangebylex

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

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

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["zrevrangebylex" ] }';

zrevrangebyscore

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

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

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["zrevrangebyscore" ] }';

zrevrank

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

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

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

zscan

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

См. SCAN

zscore

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

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

zunion

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

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

zunionstore

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

Объединяет элементы двух или более сортированных множеств, хранящихся по указанным ключам (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 blocking list slow write

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

blmpop

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

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

blpop

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

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

brpoplpush

BRPOPLPUSH source destination timeout
поддерживается с версии 0.13.0 blocking list slow write

Работает аналогично RPOPLPUSH, но с использованием блокировки. При использовании внутри блока MULTI или EXEC данная команда ведёт себя полностью идентично RPOPLPUSH.

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["brpoplpush" ] }';

brpop

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

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

lindex

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

Возвращает элемент с указанным индексом (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 list slow write

Вставляет в список, хранящийся по ключу 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 fast list read

Возвращает длину (количество элементов) списка, хранящегося по ключу 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 list slow write

Перемещает первый/последний элемент первого списка (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 list slow write

Извлекает (и удаляет) один или несколько (count) элементов в начале (LEFT) или в конце (RIGHT) из первого непустого списка ключей (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 fast list write

Извлекает (и удаляет) указанное число (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 list read slow

Возвращает индекс найденного в списке, хранящегося по ключу 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 fast list write

Вставляет указанные элементы в начало списка, хранящегося по ключу 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 fast list write

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

lrange

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

Возвращает диапазон элементов списка, хранящегося по ключу 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 list slow write

Удаляет из списка, хранящегося по ключу 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 list slow write

Устанавливает индекс (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 list slow write

Обрезает список, хранящийся по ключу 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 fast list write

Извлекает (и удаляет) указанное число (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"

rpoplpush

RPOPLPUSH source destination
поддерживается с версии 0.13.0 list slow write

Извлекает один последний элемент из множества, хранящегося в source и добавляет его в начало множества, хранящегося в destination. Если source не существует, команда вернёт nil и ничего не переместит. Если в качестве source и destination указать одно и то же множество, то команда переместит элемент из его конца в его начало.

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["rpoplpush" ] }';

rpush

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

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

rpushx

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

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

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

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

psubscribe

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

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

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

publish

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

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

pubsub channels

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

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

pubsub numpat

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

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

pubsub numsub

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

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

pubsub shardchannels

PUBSUB SHARDCHANNELS [pattern]
поддерживается с версии 1.0.0 pubsub slow

Выводит список активных шард-каналов (каналов Redis, работающих в рамках отдельных репликасетов). Параметр pattern позволяет отфильтровать список, указав необходимый шаблон.

pubsub shardnumsub

PUBSUB SHARDNUMSUB [shardchannel [shardchannel ...]]
поддерживается с версии 1.0.0 pubsub slow

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

punsubscribe

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

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

spublish

SPUBLISH shardchannel message
поддерживается с версии 1.0.0 fast pubsub

Размещает сообщение (message) в указанном шард-канале (shardchannel). Сообщение будет доступно клиентам на всех репликах, входящих в состав репликасета, на котором создан шард-канал.

ssubscribe

SSUBSCRIBE shardchannel [shardchannel ...]
поддерживается с версии 1.0.0 pubsub slow

Подписывает клиента на получение данных из указанных шард-каналов (shardchannel). Все шард-каналы, указанные в команде, должны относиться к одному репликасету. См. также PSUBSCRIBE.

subscribe

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

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

sunsubscribe

SUNSUBSCRIBE [shardchannel [shardchannel ...]]
поддерживается с версии 1.0.0 pubsub slow

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

unsubscribe

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

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

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

append

APPEND key value
поддерживается с версии 1.0.0 fast string write

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

Пример:

> APPEND mykey "Hello"
(integer) 5
> APPEND mykey " World"
(integer) 11
> GET mykey
"Hello World"

get

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

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

getdel

GETDEL key
поддерживается с версии 1.0.0 fast string write

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

getrange

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

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

incr

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

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

incrby

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

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

incrbyfloat

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

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

mget

MGET key [key ...]
поддерживается с версии 0.12.0 fast read string

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

mset

MSET key value [key value ...]
поддерживается с версии 0.10.0 slow string write

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

psetex

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

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

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": 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 slow string write

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

Параметры:

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

setex

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

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

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

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["setex" ] }';

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

setnx

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

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

Примечание

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

ALTER PLUGIN radix 1.0.6 SET radix.redis_compatibility = '{ "enforce_one_slot_transactions": true, "push_result_includes_popped_items": true, "include_radix_section_in_info_by_default": true, "disable_scatter_gather": true, "enabled_deprecated_commands": ["setnx" ] }';

strlen

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

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

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

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

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

ALTER PLUGIN radix 1.0.6 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

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

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 scripting slow

Вызывает 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 scripting slow

Вызывает 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 scripting slow

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

script exists

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

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

script flush

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

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

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

script load

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

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

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

discard

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

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

exec

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

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

multi

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

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

unwatch

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

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

watch

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

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

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

flushall

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

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

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

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

flushdb

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

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

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

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

info

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

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

  • server
  • clients
  • memory
  • persistence
  • stats
  • replication
  • cpu
  • modules
  • errorstats
  • cluster
  • keyspace
  • commandstats
  • latencystats
  • sentinel
  • radix

Примечание

Секция radix отображается в выводе команды info только при включённом параметре include_radix_section_in_info_by_default = true, либо при явном вызове типа INFO radix clients.

Образец вывода полного набора сведений
127.0.0.1:7379> info
# Server
redis_version:8.0.0
redis_git_sha1:4d88b87df206042060f675dcf280380b8f653850
redis_git_dirty:1
redis_build_id:
redis_mode:standalone
os:Fedora Linux 7.1.3-200.fc44.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.96.0 (ac68faa20 2026-05-25)
process_id:413282
process_supervised:no
run_id:bc7e5829e9a642ffb975fca1e4b1d13e
tcp_port:6000
server_time_usec:1784042476298261000
uptime_in_seconds:5657
uptime_in_days:0
hz:3500
configured_hz:0
lru_clock:0
executable:/usr/bin/picodata
config_file:
io_threads_active:1

# Clients
connected_clients:1
cluster_connections:0
maxclients:10000
client_recent_max_input_buffer:8192
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:142606336
used_memory_human:136.00M
used_memory_rss:101560320
used_memory_rss_human:96.86M
used_memory_peak:142606336
used_memory_peak_human:136.00M
used_memory_peak_perc:100.00
used_memory_overhead:109051904
used_memory_startup:142606336
used_memory_dataset:33554432
used_memory_dataset_perc:23.53
allocator_allocated:142606336
allocator_active:142606336
allocator_resident:101560320
total_system_memory:33281937408
total_system_memory_human:31.00G
used_memory_lua:20492553
used_memory_vm_eval:20492553
used_memory_lua_human:19.54M
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:20492553
used_memory_vm_total_human:19.54M
used_memory_functions:0
used_memory_scripts:0
used_memory_scripts_human:0B
maxmemory:2000000000
maxmemory_human:1.86G
maxmemory_policy:noeviction
allocator_frag_ratio:1.68
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:57344
mem_allocator:slab
active_defrag_running:0
lazyfree_pending_objects:0
lazyfreed_objects:0

# Persistence
loading:0
async_loading:0

# Stats
total_connections_received:6
total_commands_processed:46
instantaneous_ops_per_sec:0
total_net_input_bytes:1714
total_net_output_bytes:6449
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
total_eviction_exceeded_time:0
current_eviction_exceeded_time: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:11
total_reads_processed:50
total_writes_processed:46
client_query_buffer_limit_disconnections:0
client_output_buffer_limit_disconnections:0
reply_buffer_expands:0
reply_buffer_shrinks:0
request_buffer_expands:0
request_buffer_shrinks:0
acl_access_denied_auth:9
acl_access_denied_cmd:5
acl_access_denied_key:0
acl_access_denied_channel:0
watching_clients:0
clients_in_timeout_table:0
total_watched_keys:0

# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:3c509e53-9bf0-4b3a-87a7-d0447878329a
master_replid2:3c509e53-9bf0-4b3a-87a7-d0447878329a
master_repl_offset:34958
second_repl_offset:34958
repl_backlog_active:0
repl_backlog_size:0
repl_backlog_first_byte_offset: 0
repl_backlog_histlen:0

# CPU
used_cpu_sys:6.089428
used_cpu_user:19.063304
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000
used_cpu_sys_main_thread:5.061797
used_cpu_user_main_thread:20.074558

# Modules

# Errorstats
errorstat_MALFORMED_ARGS:count=1
errorstat_SYNTAX_ERROR:count=4
errorstat_UNKNOWN_COMMAND:count=6
# Cluster
cluster_enabled:1

# Keyspace

# Commandstats
cmdstat_client|id:calls=1,usec=37,usec_per_call=37,rejected_calls=0,failed_calls=0
cmdstat_info:calls=3,usec=123,usec_per_call=41,rejected_calls=0,failed_calls=0
cmdstat_client|info:calls=5,usec=139,usec_per_call=27.8,rejected_calls=0,failed_calls=0
cmdstat_client|getname:calls=1,usec=46,usec_per_call=46,rejected_calls=0,failed_calls=0
cmdstat_client|list:calls=3,usec=83,usec_per_call=27.666666666666668,rejected_calls=0,failed_calls=0
cmdstat_client|kill:calls=11,usec=227,usec_per_call=20.636363636363637,rejected_calls=1,failed_calls=4
cmdstat_client|help:calls=1,usec=68,usec_per_call=68,rejected_calls=0,failed_calls=0
# Latencystats
latency_percentiles_usec_client info:p50.0=27,p99.0=30,p99.9=30
latency_percentiles_usec_client getname:p50.0=46,p99.0=46,p99.9=46
latency_percentiles_usec_info:p50.0=25,p99.0=79,p99.9=79
latency_percentiles_usec_client id:p50.0=37,p99.0=37,p99.9=37
latency_percentiles_usec_client help:p50.0=68,p99.0=68,p99.9=68
latency_percentiles_usec_client list:p50.0=30,p99.0=34,p99.9=34
latency_percentiles_usec_client kill:p50.0=21,p99.0=42,p99.9=42
# 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

# Radix
radix_version:1.0.6
picodata_version:26.1.5-0-gf8070ddd5
picodata_cluster_name:demo_radix
picodata_cluster_uuid:9d2e51fa-6fb8-47b7-8808-f693c6663948
picodata_instance_name:i1
picodata_instance_uuid:3c509e53-9bf0-4b3a-87a7-d0447878329a
slab_info_items_size:48928
slab_info_items_used:3656
slab_info_items_used_ratio:7.47
slab_info_quota_size:2000000000
slab_info_quota_used:33554432
slab_info_quota_used_ratio:1.68
slab_info_arena_size:33554432
slab_info_arena_used:708168
slab_info_arena_used_ratio:2.1

latency graph

LATENCY GRAPH event
поддерживается с версии 1.0.5 admin dangerous slow

Строит ASCII-график для указанного события задержки. График помогает быстро оценить тренд задержек без разбора сырых данных из LATENCY HISTORY или внешних инструментов.

Пример:

127.0.0.1:6379> latency reset command
(integer) 0
127.0.0.1:6379> latency graph command
command - high 500 ms, low 101 ms (all time high 500 ms)
--------------------------------------------------------------------------------
   #_
  _||
 _|||
_||||
11186
542ss
sss

Подробности:

  • Вертикальные подписи под столбцами графика показывают, сколько секунд, минут, часов или дней назад произошло событие. Например, 15s означает, что первое показанное событие произошло 15 секунд назад.
  • График нормализуется по шкале min-max: символ _ в нижней строке соответствует минимальному значению, а символ # в верхней строке — максимальному.

latency help

LATENCY HELP
поддерживается с версии 1.0.5 slow

Возвращает справку с описанием подкоманд LATENCY.

latency histogram

LATENCY HISTOGRAM [command [command ...]]
поддерживается с версии 1.0.5 admin dangerous slow

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

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

  • command [command ...] — одна или несколько команд, для которых нужно вернуть гистограммы задержек. Если аргумент не указан, возвращаются гистограммы для всех доступных команд.

Подробности:

  • Каждая гистограмма содержит имя команды, общее количество вызовов этой команды и карту временных корзин.
  • Каждая корзина представляет диапазон задержек и покрывает в два раза больший диапазон, чем предыдущая.
  • Пустые корзины не включаются в ответ.
  • Отслеживаются задержки от 1 наносекунды примерно до 1 секунды. Все, что выше 1 секунды, считается +Inf.
  • Максимальное количество корзин — log2(1,000,000,000) = 30.
  • Для работы команды должна быть включена расширенная статистика задержек. По умолчанию она включена. Чтобы включить ее явно, используйте CONFIG SET latency-tracking yes.
  • Чтобы удалить данные гистограмм задержек, используйте команду CONFIG RESETSTAT.

Пример:

127.0.0.1:6379> LATENCY HISTOGRAM set
1# "set" =>
   1# "calls" => (integer) 100000
   2# "histogram_usec" =>
      1# (integer) 1 => (integer) 99583
      2# (integer) 2 => (integer) 99852
      3# (integer) 4 => (integer) 99914
      4# (integer) 8 => (integer) 99940
      5# (integer) 16 => (integer) 99968
      6# (integer) 33 => (integer) 100000

latency history

LATENCY HISTORY event
поддерживается с версии 1.0.5 admin dangerous slow

Возвращает сырые данные временного ряда всплесков задержки для события event. Команда возвращает до 160 пар «метка времени — задержка» для указанного события.

Пример:

127.0.0.1:6379> latency history command
1) 1) (integer) 1405067822
   2) (integer) 251
2) 1) (integer) 1405067941
   2) (integer) 1001

latency latest

LATENCY LATEST
поддерживается с версии 1.0.5 admin dangerous slow

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

Подробности:

Каждое событие в ответе содержит следующие поля:

  • имя события;
  • Unix-метка времени последнего всплеска задержки для события;
  • задержка последнего события в миллисекундах;
  • максимальная задержка этого события за все время.

Значение «за все время» означает максимальную задержку с момента запуска экземпляра или с момента сброса событий командой LATENCY RESET.

Пример:

127.0.0.1:6379> latency latest
1) 1) "command"
   2) (integer) 1405067976
   3) (integer) 251
   4) (integer) 1001

latency reset

LATENCY RESET [event [event ...]]
поддерживается с версии 1.0.5 admin dangerous slow

Сбрасывает временные ряды всплесков задержки для всех событий или только для указанных событий.

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

  • event [event ...] — одно или несколько событий задержки, которые нужно сбросить. Если аргумент не указан, сбрасываются все события.

memory usage

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

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

slowlog get

SLOWLOG GET [count]
поддерживается с версии 1.0.5 admin dangerous slow

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

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

  • count — количество последних записей медленного журнала, которые нужно вернуть. Значение -1 возвращает все записи. По умолчанию возвращается 10 записей.

Подробности:

  • Медленный журнал фиксирует запросы, время выполнения которых превысило заданный порог.
  • Время выполнения не включает операции ввода-вывода: взаимодействие с клиентом, отправку ответа и подобные действия. Учитывается только время фактического выполнения команды, то есть участок, на котором поток заблокирован и не может обслуживать другие запросы.
  • Новая запись добавляется, когда команда превышает порог, заданный параметром конфигурации slowlog-log-slower-than.
  • Максимальное количество записей в журнале задается параметром slowlog-max-len.
  • Каждая запись содержит уникальный последовательный идентификатор, Unix-метку времени выполнения команды, длительность выполнения в микросекундах, массив аргументов команды, IP-адрес и порт клиента, а также имя клиента, если оно задано командой CLIENT SETNAME.
  • Уникальный идентификатор записи можно использовать, чтобы не обрабатывать одну и ту же запись несколько раз. Идентификатор не сбрасывается во время работы сервера и сбрасывается только при его перезапуске.

slowlog help

SLOWLOG HELP
поддерживается с версии 1.0.5 slow

Возвращает справку с описанием подкоманд SLOWLOG.

slowlog len

SLOWLOG LEN
поддерживается с версии 1.0.5 admin dangerous slow

Возвращает текущее количество записей в медленном журнале.

Подробности:

  • Новая запись добавляется в медленный журнал, когда команда превышает порог времени выполнения, заданный параметром slowlog-log-slower-than.
  • Максимальное количество записей в журнале задается параметром slowlog-max-len.
  • Когда журнал достигает максимального размера, самая старая запись удаляется при добавлении новой.
  • Очистить медленный журнал можно командой SLOWLOG RESET.

slowlog reset

SLOWLOG RESET
поддерживается с версии 1.0.5 admin dangerous slow

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

object encoding

OBJECT ENCODING key
поддерживается с версии 0.14.0 keyspace read slow

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

  • raw — стандартное кодирование текстовых строк
  • quicklist — способ кодирования списков, совместимый с типами linkedlist, ziplist и listpack в Redis
  • hashtable — стандартное кодирование множеств
  • skiplist — стандартное кодирование сортированных множеств

Команды для отладки

Команды с префиксом pico предназначены для отладки и диагностики кластера в том случае, если отсутствует возможность подключиться к Picodata другим способом.

Внимание!

Никаких гарантий на форматы вывода нет; любые попытки использования данных команд в работе приложения не поддерживаются!

pico status

admin dangerous pico

Отображает состояние команд для отладки (включено/выключено).

pico enable

admin dangerous pico

Включает использование команд для отладки.

pico disable

admin dangerous pico

Выключает использование команд для отладки.

pico sql

admin dangerous pico

Позволяет выполнить SQL-запрос в Redis-консоли.

Пример:

127.0.0.1:7379> pico sql "SELECT * FROM _pico_user WHERE schema_version=4"
1) "+----+------+----------------+------------------------------------------------+-------+------+"
2) "| id | name | schema_version | auth                                           | owner | type |"
3) "+============================================================================================+"
4) "| 33 | andy | 4              | ['md5', 'md59ee8b0076cf18219f9b2f585f57d4d0c'] | 1     | user |"
5) "+----+------+----------------+------------------------------------------------+-------+------+"
6) "(1 rows)"

pico lua

admin dangerous pico

Позволяет выполнить Lua-запрос в Redis-консоли.

Пример:

127.0.0.1:7379> pico lua "return box.cfg.memtx_dir"
"data"

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

1.0.6 — 2026-07-21

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

  • Добавлена команда hello

Исправления

  • Добавлена явная проверка на дефолтный пароль для md5 и chap-sha1
  • Различные исправления и улучшения аутентификации и авторизации

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

  • Set_connection_user_name теперь принимает String
  • Битовая маска доступа к БД вынесена в отдельное поле контекста подключения

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

  • TestRedisMultiDiffBucket тест переведён на ту же модель, что и остальные multi-тесты

Прочее

  • Улучшены сообщения об ошибках в auth тестах
  • Удалено скачивание riot из нашего докер-образа redis
  • Удалена job'а, тестирующая миграцию с помощью RIOT
  • Rust обновлён до 1.97
  • 👷 ветка release/1.0 добавлена в cargo-deny-scheduled

1.0.5 — 2026-06-29

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

  • Реализованы команды LATENCY, SLOWLOG, CLIENT
  • Изменено поведение AUTH и ACL для большего соответствия Редису
  • Добавлен abi модулей

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

  • Реализована команда migrate-down

Исправления

  • Информация о Radix и Picodata вынесена в отдельную секцию INFO
  • Исправлены индексы на _radix_ssubscriber в БД 8 и 9
  • Auth_password_enforce_lowercase выставляется в TRUE после создания пользователя
  • Исправлено поведение SET с флагами NX и GET
  • Блокирующие команды больше не создают локи в транзакциях
  • Поведение LRANGE приведено в соответствии с Redis
  • Поведение GETRANGE унифицированно с Redis
  • Добавлена проверка на переполнение в INCR-командах
  • Исправлено превращение nil в false в Lua-скриптах
  • Исправлен тип, возвращаемый redis.pcall
  • Исправлено сообщение об ошибке NotInteger
  • В Lua вынесена функция setmetatable
  • Добавлено превращение хеша в нижний регистр перед поиском в EVALSHA
  • Изменены RESP-типы в командах LPOP, RPOP
  • Команды LPOP/RPOP теперь выставляют мета-поле count в типе
  • Исправлено поведение hmget — теперь команда всегда возвращает список
  • Исправлена команда CLUSTER SHARDS
  • Увеличен response_timeout до 5с в CI-окружении
  • Исправлено получение cluster bus port
  • Исправлена работа с glab и jq

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

  • ⚡ применён locally/globally-приём на flush и flushall

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

  • Добавлен ADR на команды категории geo

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

  • Clippy-правки в radix-acl и radix-cli
  • Рефакторинг слоя репозиториев

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

  • Типизированные хелперы изменения конфигурации
  • Заменён pgx на драйвер picodata-go
  • Добавлен тест на идентичность схем всех баз данных
  • Переписан тест на downgrade/upgrade
  • Helper.go выделен в отдельный модуль
  • Добавлена заглушка для команд config
  • Добавлена заглушка команды function flush для запуска редис-тестов
  • Добавлен рецепт запуска редис-тестов
  • Добавлен рецепт generate::redis-tests-update для вендоринга тестов Redis
  • Переработаны тесты на pubsub
  • Удалён дублирующий тест module_dict_api_selftest_passes
  • ✅ добавлена отладочная информация в тестирование миграций

Прочее

  • ✅ добавлен линтер на синхронность блоков install_sql в топологиях
  • Обновлены сборочные образа до 26.1.4
  • Добавлен таргет standalone_compatible
  • Обновлены хедеры лицензий
  • Временно убраны бенчмарки из CI
  • Исправлена ошибка из-за выбора RESP3 по умолчанию в тестах миграции
  • Выделили отдельные правила запуска проверок по расписанию
  • Исправлена джоба test-migration
  • Исправили авторизацию для glab

Build

  • 👷 добавлены проверки компилируемости тестов в ранние стадии CI
  • Добавлен отдельный integration рецепт в justfile
  • ⬆️ обновлены зависимости
  • Исправлено определение версий для тестов на даунгрейд

Vendor

  • 🤖 обновлены тесты Redis до 8.8.0

1.0.4 — 2026-05-27

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

  • Добавлена миграция данных в radix-cli

Исправления

  • Исправлен неверный подсчет значения курсора в SCAN
  • Исправлен лишний пробел в выводе master в cluster shards

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

  • Добавлена документация к radix-cli
  • Добавлен АДР о совместной работе AUTH и подсистемы ACL
  • Добавлен раздел о работе с merge request'ами

Прочее

  • Упаковка radix-cli по аналогии с ouroboros-cli
  • Разрешена лицензия BSL-1.0
  • Исправлен python → python3 в lint.just, обновлены метаданные сертификации
  • Возвращена явная сборка radix-cli перед упаковкой плагина
  • Добавлен CI для radix-cli
  • Обновлены cliff конфиги под radix-cli
  • Добавлена джоба для очистки веток
  • Джоба с тикетом на документацию переведена на glab
  • Автоматизировано создание веток поддержки
  • Замёржили авторизацию гитлаба и основного репозитория для докера
  • Перевели CI с событий на ветках на события на MR'ах

1.0.2 — 2026-05-13

Прочее

  • В test-unlogged добавлен -failfast
  • Мигрировали сборку Docker-образов с Kaniko на BuildKit rootless

Build

  • Выделили версию плагина в Dockerfile
  • Исправили детект версии для теста даунгрейда

1.0.1 — 2026-05-13

Исправления

  • Команды PING и INCRBYFLOAT приведены в соответствие с Redis
  • Поправлено превращение структур из Lua в RESP2
  • Исправлена интерполяция переменных в ошибках в migration_controller
  • Исправлено использование стореджей в транзакциях
  • Исправлен учет шард подписок с реплики
  • Исправлено обновление статистики по ключам при обращениях к виртуальной БД
  • Исправлено ожидание уже завершенных файберов при дропе листенера
  • Поправлен вывод списков в командах EVAL

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

  • Добавлены полные скрипты для примеров в документации
  • Добавлена информация по поводу несовместимости старых конфигурационных файлов в пользовательской документации

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

  • Обновлена логика Lua-скриптов

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

  • Добавлены тесты на статистику spubsub

Прочее

  • Добавили детектор сломанных записей в поставку
  • 👷 добавили standalone-докер образ для быстрого тестирования

Build

  • ⬆ добавили детектор коррапченных данных

Lint

  • Исправили заголовки лицензий в детекторе

1.0.0 — 2026-04-30

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

  • Добавлена генерация и валидация ACL-категорий
  • Добавлена статика eviction
  • Убрано разделение на acl и auth, теперь включение авторизации подразумевает включение ACL
  • Добавили сборку докер-образа на релизе
  • Поправили работу выключенного вытеснения, теперь это noop
  • Реализована проверка доступа по ACL
  • Используем машинерию Picodata для tcp
  • Добавлена проверка локальности кода и данных сервиса Radix
  • Добавлена возможность читать метаданные о сервисах плагинов
  • Добавлен валидатор контекста миграции и настройка журналируемости системных таблиц
  • Добавлена настройка scatter_gather
  • Убрано двойное чтение таблицы types при вытеснении
  • Добавлено обращение к LFU кешу при вытеснении
  • На TTL индексах включена exclude_null настройка
  • Улучшен алгоритм выбора БД для вытеснения
  • Реализовано вытеснение с мягким ограничением по памяти
  • Добавлена инфраструктура для вытеснения устаревших данных
  • Закеширован список баз данных с признаком локальности
  • Добавлена no-op реализация CLIENT
  • Добавлена поддержка команд getdel и append
  • Добавлена проверка на несовместимые изменения через git-cliff для тестов на даунгрейд
  • Добавлена совместимость с будущими версиями Picodata
  • Добавлена статистика ACL
  • 📈 добавлены метрики request_buffer_expands и request_buffer_shrinks

Ломающие изменения

  • Внесли bucket_id в PK во всех таблицах

Исправления

  • ⚡ команда INFO ускорена
  • Не выходить из listener без отмены файбера
  • Исправлены тесты после включения флага push_result_includes_popped_items
  • Исправлен запуск теста с tls downgrade
  • Реализован правильный учет активных подписок
  • Unsubscribe без аргументов отписывает от всех существующих подписок
  • Исправили баг в декременте счётчика ключа при вытеснения
  • Исправили возвращаемое значение hmset
  • Исправлено сохранение правил ACL
  • Исправлена паника при использовании ref cell в транзакциях
  • Идентификаторы соединений теперь являются целочисленными и соответствуют Redis
  • Исправлено удаление нескольких ключей через unlink
  • Незнакомые команды теперь не отображаются в статистике
  • Подкоманды в статистике форматируются через символ |
  • Исправлена некорректная работа счетчиков в статистике
  • Usec и usec_per_call теперь считаются корректно
  • Исправлен пустой вывод в INFO commandstats
  • Исправлена неверная конвертация в секунды в INFO
  • Улучшена совместимость с будущими версиями Picodata
  • Исправлена конфигурация кластеров разработчиков
  • Исправил некорректный вывод TYPE для zset
  • 🔒 обновлена библиотека bytes
  • Исправлена запись нулевых данных cluster info
  • Изменена сериализация ответов GET/SET/TYPE в lua
  • Исправлено хранение строк
  • Исправлена некорректная десериализация из lua-скрипта
  • Убрано состояние Reader из публичного контракта
  • 🧵 добавлен RefCell к Crc16Hasher
  • 🩹 изменён алгоритм расширения входящего буфера
  • 🩹 изменён алгоритм определения активности бакета
  • Исправлен алгоритм уменьшения входящего буфера

Ломающие изменения

  • 💥 исправлен алгоритм вычисления RedisBucketId по ключу

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

  • Применение ACL при миграции больше не ожидается глобально
  • ⚡ удалён реестр отложенных действий
  • Исправлена отправка ответов на пакетный запрос

Ломающие изменения - Добавлена оптимизация списков при помощи использования дробных чисел для индексов

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

  • Добавлена инструкция по настройке адресов и TLS
  • Добавили описание ситуации с пустыми паролями
  • Актуализирована пользовательская документация
  • Добавлена инструкция по экспорту метрик через redis_exporter и Prometheus
  • Добавлена инструкция по настройке Grafana с Redis Data Source
  • Добавлена статья по переносу данных с помощью RIOT
  • Изменена формулировка о неприменимости ACL к команде SELECT
  • Дополнен перечень поддерживаемых ACL команд
  • Исправлено описание вычисления актуальных прав
  • Исправлена опечатка
  • Описана разница в доступе к базам Redis vs Radix
  • Написан ADR для ACL

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

  • Удален channel-индекс на шард-подписки
  • Упрощена логика очистки подписок при обрыве соединения
  • Переписан макрос retry! с дефолтами
  • Pubsub-ы теперь используют глобальные таблицы
  • Убрали ручную сериализацию LockType и Type
  • Переименовали методы декодирования данных из Picodata
  • Переименовали в коде oset в zset
  • Заменили префикс N на суффикс Record
  • Привели имена методов к Rust naming convention
  • ToEntityKey удалён
  • Добавили отдельную структуру для первичного ключа типов
  • Добавили отдельную структуру для первичного ключа Lua-скриптов
  • Добавили отдельную структуру для первичного ключа строк
  • Добавили отдельную структуру для первичного ключа каналов
  • Добавили отдельную структуру для первичного ключа подписчиков по шаблону
  • Добавили отдельную структуру для первичного ключа подписчиков
  • Добавили отдельные структуры для первичных ключей блокировок сортированных множеств
  • Добавили отдельные структуры для первичных ключей блокировок списков
  • Добавили отдельную структуру для первичного ключа списков
  • Добавили отдельную структуру для первичного ключа упорядоченных множеств
  • Добавили отдельную структуру для первичного ключа множеств
  • Добавили отдельную структуру для первичного ключа хешей
  • Вернули Display вместо Debug для наших сущностей
  • Изменили сериализацию типа сущности или блокировки на u8
  • Реализовано zero-copy чтение строковых полей из Tuple
  • Унифицировали десериализацию сущностей
  • Реализовали ToEntityKey для всех сущностей
  • Реализована возможность ленивой десериализации сортированных множеств
  • Реализована возможность ленивой десериализации множеств
  • Реализована возможность ленивой десериализации списков
  • Сортированные множества переведены на трейты с отдельных типов
  • Множества переведены на трейты с отдельных типов
  • Списки переведены на трейты с отдельных типов
  • Реализована возможность ленивой десериализации блокировок упорядоченных множеств
  • Реализована возможность ленивой десериализации блокировок списков
  • Реализована возможность ленивой десериализации хешей
  • Реализована возможность ленивой десериализации каналов
  • Реализована возможность ленивой десериализации lua скриптов
  • Реализована возможность ленивой десериализации подписок по шаблону
  • Реализована возможность ленивой десериализации подписок
  • Реализована возможность ленивой десериализации типов
  • Реализована возможность ленивой десериализации строк
  • rtype вынесен в отдельный модуль
  • Снизим уровень логирования в вытеснении
  • В крейте Radix-picodata код разделён на мелкие модули
  • Код в крейте Radix разделён на несколько модулей
  • Использовали inspect_err вместо map_err
  • Удалены устаревшие аргументы в локах
  • Добавлена роль pico_metadata_reader
  • Миграции упрощены к релизу 1.0
  • Мутабельные ссылки трейта Cmd изменены на иммутабельные
  • calculate_sha1 унифицирован
  • Удалены абстракции над BytesMut
  • Удалены пробелы в конце строк в sql запросах
  • Убран избыточный pattern-matching
  • Добавлена реализация Drop для Reader и Writer
  • 🎨 упрощён код обработки входящих запросов
  • 🎨 упрощён код Shrinker
  • ♻️ добавлена обработку смены состояния бакетов
  • 🚚 lua вынесен из строковых констант в *.lua файлы
  • 💥 переписан алгоритм определения репликасета по бакету
  • ♻️ закешировано id соединения в функции его обработки
  • ⚡ закешированы инстансы Crc16Hasher
  • ⚡ изменён алгоритм вычисления репликасета по bucket_id
  • Переписан основной цикл обработки команд
  • ⬆️ крейт redis-protocol обновлён до 6.0.0
  • ⚗️ параметр соединения tcp_no_delay явно выставляется в true

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

  • Добавлены тесты на багфиксы
  • Добавлены тесты на удаление множеств и отсортированных множеств в FLUSH-командах
  • Обновлены тесты в связи с новым поведением authorization_mode и default пользователя
  • Убрали использование устаревшей настройки addr
  • Понизили watermark для более стабильной работы тестов
  • Добавлены тесты на вытеснение на кластерном режиме
  • Обновлена конфигурация тестовых стендов согласно новой валидации
  • Добавлены интеграционные тесты на eviction
  • Sentinel-тесты теперь сами накатывают конфиг, в дефолтном конфиге sentinel_enabled выставлен в false
  • Исправлено чтение ответа редиса для кастомных команд в тестах
  • Добавлен тест на status reply
  • Добавлен тест на eval целого числа

Прочее

  • 👷 исправлена сборка релизного докер-образа
  • Добавлен тест на невалидный сценарий tls
  • Выставили push_result_includes_popped_items по умолчанию в true
  • Уменьшили количество повторяемого кода в пайплайне
  • Обновили образа для тестов миграции данных
  • Изменим версию Pike в бенчмарках на 5.0.0
  • Обновили rust-edition до 2024
  • Обновили pike до 5.0.0
  • Обновим Picodata в CI до 26.1.2
  • Обновили зависимости для включения последних исправлений
  • Перевели bench джобу на unlogged таблицы
  • Обновили rust до 1.95
  • Обновили rand до 0.10.1
  • Поправим версию крейта eviction
  • Запуск всех тестов с tls
  • Исправлен запуск бенчмарков
  • Обновлён крейт unicode-segmentation до 1.13.2
  • Test-migration сохраняет артефакты после запуска
  • Все тесты в рамках CI работают с -failfast
  • Sdk обновлен до 26.1.1
  • Внесены небольшие исправления в документацию к observability
  • В гайд по observability добавлены Dockerfile и docker-compose.yml
  • Переструктурирована документация по observability
  • Увеличен интервал сбора метрик до 1 минуты
  • Удален полуживой compose в корне
  • Добавлены dev-контейнеры для сбора метрик в Redis и Radix
  • Добавлен контейнер для локальной работы с Grafana
  • Обновлён Rust до 1.94, исправлены замечания clippy
  • Обновили версии зависимостей в SBOM-файлах
  • Обновили Picodata до 25.5.9 и Pike до 3.2.1
  • Добавлена возможность запуска deploy-certified-build для ручных пайплайнов
  • Добавлена генерация SBOM-файлов для ФСТЭК-сертификации
  • 📌 зависимости обновлены до последних версий
  • Исправлен запуск бенчмарков на main
  • Улучшено использование gitlab cache для cargo
  • Добавлены контроли для ФСТЭК-сертификации
  • Добавлен пайплайн для проверки переноса данных с помощью RIOT
  • Обновлен docker-compose.yml для Redis
  • Обновлены Dockerfile в репозитории с учётом новых образов
  • Убраны лишние операции при обработке клиентского буфера
  • Явно указан идентификатор лицензии крейта colog
  • Добавлена проверка cargo deny для ФСТЭК-сертификации
  • Добавлен тир arbiter в кластер по умолчанию
  • Исключено время записи ошибки через логгер в бенчмарках
  • Добавлена сортировка результатов по имени команды в бенчмарках
  • 👷 добавлена команда lint::fix
  • 📄 обновлены лицензионные заголовки в связи с новым годом
  • Исправлен CI для ветки main
  • 📄 обновлены лицензионные заголовки в связи с новым годом

Ломающие изменения

  • Удалена очень старая настройка addr

Build

  • Исправили детектор ломающих изменений для релиза
  • Добавлена проверка на ломающие изменения в тестовые скрипты
  • Заменили луашный костыль ожидания ребаланса на Pike
  • 📦 добавлена поддержка fedora:43, alt:p11 и osnova onyx:3
  • 📦 удалена поддержка fedora:41 в связи с её EOL
  • Исправлен скрипт, ожидающий конца ребаланса
  • 📦 добавлена поддержка redos:8.0
  • Добавлен простенький детектор завершения ребаланса стораджей

0.14.1 — 2026-02-18

Исправления

  • Добавлена совместимость с будущими версиями для системных таблиц

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

  • Из TCP-сокета в случае массива вычитываются все данные

Прочее

  • Обновлены Dockerfile в репозитории с учётом новых образов
  • Обновил лицензионные заголовки в связи с новым годом

Build

  • добавлена поддержка fedora:43, alt:p11 и osnova onyx:3
  • удалена поддержка fedora:41 в связи с её EOL

0.14.0 — 2025-12-23

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

  • Добавлена статистика использования памяти

Исправления

  • Исправлено поведение флага push_result_includes_popped_items — теперь он влияет только на вывод
  • Исправлен вывод результата команды pico lua — теперь он включает в себя все элементы таблиц
  • Исправлен вывод ошибки pico sql — теперь выводятся все строчки, вместо только первой

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

  • Поправили заголовки лицензий в файлах и добавили в утилиту

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

  • Исправлен вывод ошибок теста на даунгрейд плагина

Прочее

  • Бенчи надо для удобства катать и на мейне
  • добавим по тесткейсу на каждый процент перформанса
  • выставим RUST_LIB_BACKTRACE в 0
  • добавил утилиту для генерации ключей в каждый слот

Build

  • вернул команды для обновления ченжлога
  • перевели сборку Radix на just

0.13.0 — 2025-11-20

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

  • Добавлена команда QUIT
  • Добавлены команды pico для дебага
  • Добавлена секция latency в info
  • Добавлена поддержка шардированного пабсаб
  • Добавлена поддержка rpoplpush и brpoplpush
  • Добавлены команды со структурой данных set

Исправления

  • Добавлена повторная попытка отправить запрос обновления подписчика паттерна через cas
  • Exec всегда помечает соединение как нетранзакционное
  • Исправлено поведение флага PUSH_RESULT_INCLUDES_POPPED_ITEMS: теперь он считает элементы, даже если они все улетели в блокирующую команду
  • Убрана паника при отсутствии аргументов pubsub shardnumsub
  • Исправлены команды zremrangeby*: теперь они удаляют ключ, если были удалены все его элементы
  • Исправлены команды z*store: теперь они заменяют значение ключа вне зависимости от типа
  • Исправлены команды s*store: теперь они заменяют значение ключа вне зависимости от типа
  • Исправлено удаление patsubscriber
  • Исправлена команда mset — теперь она перезаписывает значение ключа вне зависимости от типа
  • Исправлен расчёт бакета для z*store команд
  • Исправлено поведение флага ch команды zadd
  • Исправлена передача аргументов начала и конца поиска в командах zrevrange*
  • Исправлено сообщение об ошибке значения первого и последнего индексов поиска команды zrange
  • Исправлены команды eval и eval_ro — теперь они не сохраняют скрипт
  • Исправлено поведение команды lrange с отрицательными индексами
  • Добавлена сортировка значений в команде lpos и правильная обработка аргумента COUNT
  • Исправлен порядок элементов в блокирующих командах над списками при удалении справа
  • Исправлена команда hincrby — теперь она создаёт тип, если ключа не было в базе данных
  • Исправлены команды ttl и pttl — теперь их результаты округляются вверх
  • Исправлены команды set, psetex, setex, setnx — теперь они перезаписывают ключ вне зависимости от типа
  • Инплейс проверки для defer модуля
  • Детализация ошибок записи в Picodata
  • Игнорирование expelled-узлов при определении режима работы
  • Запрещены команды в контексте пабсаб кроме пабсаб команд
  • Добавлена передача адреса при возврате moved ошибки
  • Исправлено поведение zrandmember в соответствии с документацией redis

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

  • детализировал описание настройки enforce_one_slot_transactions
  • добавили описание особенностей некоторых команд
  • добавили таймаут в 20 минут на все команды из README

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

  • исправили предупреждения rust 1.91

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

  • Добавлен тест команды quit на редисе
  • Обновлены ключи в тесте TestRedisPExpireBusyMainLoop — теперь они уникальны между клиентами
  • Добавили реакцию на PICODATA_WRITE_ERROR — переподключение
  • Обновили зависимости в тестах
  • Добавлен запуск интеграционных тестов на Redis Cluster, Redis Standalone, Radix Standalone и Radix в режиме совместимости с Redis
  • Добавил вывод отчёта о бенчмарках в гитлаб
  • Добавлена проверка одновременной работы sentinel и deprecated команд
  • Добавлен режим тестирования на реплике для чтения
  • Тест на downgrade плагина

Прочее

  • исправил сообщения на колбеках: info при успехе, warn при ошибке
  • добавлено логирование на плагин хуках
  • сделаем отдельный образ для тестов редиса
  • унифицировали установку го и версию Picodata для тестов
  • обновлён темплейт issue — теперь правильно выставляется лейбл бага

Chore

  • Удалено разделение команд на сабкоманды

0.12.0 — 2025-10-29

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

  • Implement cluster info
  • Добавлена команда mget

Исправления

  • Вывод значения настройки max_clients в info (498d8e9)
  • В вывод команды info server добавлены имя и uuid инстанса Picodata (417d62b)

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

📝 обновлена документация о процессе разработки (4713cfe)

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

Упорядочено чтение настроек на старте Radix (ec23336)

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

  • Добавлен тест вывода параметра maxclients (761fcf8)
  • Передача пути к Picodata в установке пароля в Makefile (8e86a40)

Прочее

  • Обновили SDK до 25.4.3 (8d9514e)
  • 👷 исправлен CI для ветки main (a5ff0e1)
  • Bump picodata version to 25.4.1 (cd5cd2d)

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

  • Обновим Picodata до 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

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

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

Прочее

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

Build

  • ⬆ picodata 25.1.2

0.6.1 — 2025-04-28

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

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

Прочее

  • 👷 вернём 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

  • Используем Pike 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 для мультитирного (многорядного?) Radix

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

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

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

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

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

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

Прочее

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

Bench

  • List

Build

  • `make pico_radix_release` для запуска релизного Radix
  • ⬆ обновимся до Picodata 25.1
  • На `pico_stop` убиваем Picodata из `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

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

  • 🔊 фильтрация логов для бедных
  • Добавил версию Picodata в вывод `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
  • ➕ переводим плагин на 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

Исправления

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

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

  • ⚗ 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