Перейти к содержимому

Операции со списками

В Managed Valkey все управление списками выполняется командами Valkey. С полным списком команд Valkey вы можете ознакомиться в официальной документации Valkey.

Обратите внимание, что в Managed Valkey некоторые команды Valkey недоступны.

Чтобы получить элементы списка по диапазону индексов, используйте команду LRANGE.

  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя ключа с помощью итеративного обхода.

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Выполните команду:

    text
    LRANGE <имя ключа> <начало> <конец>

    В команде <начало> и <конец> — индексы первого и последнего элементов диапазона, включая обе границы. Индексация начинается с 0. Отрицательные индексы отсчитываются от конца: -1 — последний элемент, -2 — предпоследний. Диапазон 0 -1 охватит весь список.

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

Чтобы получить элемент списка по индексу, используйте команду LINDEX.

  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя ключа с помощью итеративного обхода.

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Определите позицию элемента.

  6. Выполните команду:

    text
    LINDEX <имя ключа> <индекс>

    В команде <индекс> — позиция элемента: 0 для первого, 1 для второго, -1 для последнего, -2 для предпоследнего.

    Команда вернет значение элемента. Если ключ не существует или индекс выходит за границы списка, команда вернет nil. Элемент сохранится в списке.

Чтобы получить длину списка, используйте команду LLEN.

  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя ключа с помощью итеративного обхода.

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Выполните команду:

    text
    LLEN <имя ключа>

    Команда вернет количество элементов списка. Если ключ не существует, команда вернет 0.

Чтобы добавить элементы в список, используйте одну из команд:

  • LPUSH — добавить элементы в начало;
  • RPUSH — добавить элементы в конец.
  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

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

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Выполните нужную команду:

    • LPUSH
    • RPUSH
    text
    LPUSH <имя ключа> <элемент 1> [<элемент 2> ...]

    При добавлении нескольких элементов, они поместятся в начало по очереди. Последний аргумент окажется первым элементом списка. Например, после LPUSH <имя ключа> a b c в начале окажутся c, b, a.

    Команда добавит элементы и вернет длину списка после операции. Если ключ не существует, команда создаст список.

Чтобы извлечь и удалить элементы списка, используйте одну из команд:

  • LPOP — извлечь элементы из начала;
  • RPOP — извлечь элементы из конца.
  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя ключа с помощью итеративного обхода.

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Выполните нужную команду:

    • LPOP
    • RPOP
    text
    LPOP <имя ключа> [<количество>]

    В командах <количество> — неотрицательное целое число элементов для извлечения. Если количество не указано, команда извлечет один элемент и вернет его значение. Если количество указано, команда вернет список извлеченных элементов, даже при количестве 1.

    Команда удалит и вернет не более указанного числа элементов. Для существующего списка при количестве 0 вернется пустой список. Если ключ не существует, вернется nil. После извлечения последнего элемента ключ списка будет удален. При извлечении из конца элементы вернутся в порядке от последнего к первому.

Чтобы изменить элемент списка по индексу, используйте команду LSET.

  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя ключа с помощью итеративного обхода.

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Определите позицию элемента.

  6. Выполните команду:

    text
    LSET <имя ключа> <индекс> <новое значение>

    В команде <индекс> — позиция элемента. Правила индексации описаны в инструкции по получению элемента.

    Команда заменит значение элемента и вернет OK. Длина списка сохранится. Если ключ не существует или индекс выходит за границы списка, команда вернет ошибку.

Чтобы вставить элемент до или после другого элемента списка, используйте команду LINSERT.

  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя ключа с помощью итеративного обхода.

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Узнайте значение элемента.

  6. Выполните нужную команду:

    • Вставить элемент до другого
    • Вставить элемент после другого
    text
    LINSERT <имя ключа> BEFORE <опорное значение> <новый элемент>

    В командах <опорное значение> — значение элемента, относительно которого нужно выполнить вставку. При повторении опорного значения будет использовано первое совпадение от начала списка.

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

Чтобы оставить в списке только элементы указанного диапазона, используйте команду LTRIM.

  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя ключа с помощью итеративного обхода.

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Выполните команду:

    text
    LTRIM <имя ключа> <начало> <конец>

    В команде <начало> и <конец> — индексы границ сохраняемого диапазона. Обе границы будут включены. Индексация начинается с 0. Отрицательные индексы отсчитываются от конца: -1 — последний элемент, -2 — предпоследний. Например, диапазон 0 9 сохранит не более первых десяти элементов.

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

Чтобы переместить элемент между списками, используйте одну из команд:

  • RPOPLPUSH — переместить последний элемент исходного списка в начало целевого;
  • LMOVE — выбрать сторону извлечения и сторону добавления.
  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя исходного ключа с помощью итеративного обхода.

  4. Узнайте имя существующего целевого ключа с помощью итеративного обхода.

  5. Выберите имя для нового целевого ключа и убедитесь, что оно не занято.

  6. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  7. Выполните нужную команду:

    • RPOPLPUSH
    • LMOVE
    text
    RPOPLPUSH <имя исходного ключа> <имя целевого ключа>

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

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

  • BLPOP — извлечь элемент из начала;
  • BRPOP — извлечь элемент из конца.
  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя ключа с помощью итеративного обхода.

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Выполните нужную команду:

    • BLPOP
    • BRPOP
    text
    BLPOP <имя ключа 1> [<имя ключа 2> ...] <таймаут>

    В командах <таймаут> — неотрицательное время ожидания в секундах. Значение 0 задаст ожидание без ограничения времени со стороны команды.

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

Чтобы удалить элементы списка по значению, используйте команду LREM.

  1. Подключитесь к кластеру.

  2. Переключитесь на нужную базу данных.

  3. Узнайте имя ключа с помощью итеративного обхода.

  4. Убедитесь, что значение ключа — список. Должно вернуться значение list.

  5. Узнайте значение элемента.

  6. Выполните команду:

    text
    LREM <имя ключа> <количество> <значение>

    В команде <значение> — значение удаляемых элементов. Параметр <количество> задает число совпадений и направление поиска:

    • Положительное число — удалить не более указанного числа совпадений от начала к концу.
    • Отрицательное число — удалить не более числа совпадений, равного модулю значения, от конца к началу.
    • 0 — удалить все совпадения.

    Команда вернет количество удаленных элементов. Если ключ не существует или совпадений нет, команда вернет 0. После удаления последнего элемента ключ списка будет удален.