📒 

Использование команд scan в Redis в Linux

Redis, хранилище структур данных in-memory с открытым исходным кодом, известно своей скоростью и универсальностью в качестве базы данных ключ-значение. Одной из его мощных особенностей является возможность инкрементного итерационного просмотра наборов данных с помощью команд scan. Это особенно полезно при работе с большими массивами данных, так как позволяет эффективно извлекать данные, не перегружая сервер. Для пользователей выделенных серверов Linux использование команд scan в Redis может повысить производительность работы с данными, обеспечивая точную, оптимизированную по ресурсам обработку наборов данных. В этой статье мы рассмотрим, как эффективно использовать команды scan в Redis в среде Linux, предложим подробные примеры и лучшие практики для управления и получения данных в масштабе.

Что такое команды scan?

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

Команды scan ключей

  1. SCAN: Итерация по ключам в пространстве ключей.
  2. SSCAN: итерация по элементам в наборе.
  3. HSCAN: итерация по полям и значениям в хэше.
  4. ZSCAN: итерация по членам и оценкам в отсортированном множестве.

Основной синтаксис команд scan

Каждая команда scan имеет схожий синтаксис:

SCAN cursor [MATCH pattern] [COUNT count]
  • курсор: Целое число, обозначающее позицию, с которой нужно начать сканирование. Чтобы начать новое сканирование, используйте 0.
  • MATCH pattern: (необязательно) Шаблон для фильтрации возвращаемых ключей. Поддерживаются шаблоны в стиле glob.
  • COUNT count: (необязательно) Подсказка для Redis о том, сколько элементов возвращать в каждой итерации.

Установка Redis в Linux

Прежде чем мы перейдём к использованию команд scan, убедитесь, что Redis установлен в вашей системе Linux. Для тех, кто использует выделенный сервер Debian, установка Redis очень проста и может расширить возможности сервера для эффективной обработки данных в памяти. Вот как установить Redis на систему на базе Debian, обеспечив стабильную среду, оптимизированную для высокопроизводительной работы.

Следуя этим шагам, вы установите Redis таким образом, чтобы использовать ресурсы и стабильность вашего выделенного сервера Debian, что идеально подходит для выполнения сложных задач по обработке данных.

sudo apt update

sudo apt install redis-server

Для CentOS/RHEL используйте:

sudo yum install redis

После установки запустите сервер Redis:

sudo systemctl start redis

Подключение к Redis

Откройте терминал и подключитесь к экземпляру Redis с помощью Redis CLI:

redis-cli

Теперь вы можете выполнять команды Redis в CLI.

Использование команды SCAN

Пример 1: Базовый SCAN

Чтобы получить все ключи в базе данных Redis, вы можете использовать:

SCAN 0

Эта команда вернет курсор и список ключей.

Пример 2: Использование команды MATCH для фильтрации клавиш

Если вы хотите найти ключи, которые соответствуют определенному шаблону, например, ключи, начинающиеся с “user:”, вы можете использовать:

SCAN 0 MATCH username:*

Эта команда возвращает только те ключи, которые начинаются с “user:”.

Пример 3: Указание COUNT

Чтобы указать, сколько ключей Redis должен возвращать в каждой итерации, вы можете задать счетчик:

SCAN 0 COUNT 10

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

Пример 4: Итерация по всем ключам

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

cursor=0
while true; do
result=$(redis-cli SSCAN myset $cursor MATCH apple:*)
echo "$result" # Обработать результат по мере необходимости
cursor=$(echo "$result" | awk 'NR==1{print $1}') # Обновление курсора
if [[ "$cursor" == "0" ]]; then
break # Остановитесь, когда курсор вернется к 0
fi
done

Использование команды SSCAN

Команда SSCAN используется для итерационного перебора элементов в наборе. Ее синтаксис аналогичен синтаксису команды SCAN:

SSCAN клавиша курсора [MATCH pattern] [COUNT count]

Пример SSCAN

Шаг 1: Создание набора и добавление элементов

Давайте создадим набор под названием myset и добавим в него несколько элементов:

SADD myset "apple"
SADD myset "банан"
SADD myset "вишня"
SADD myset "финик"
SADD myset "бузина"

Шаг 2: Используйте команду SSCAN

Теперь, когда у нас есть набор с именем myset, мы можем использовать команду SSCAN для итерации по его элементам.

  1. Базовая команда SSCAN:Предположим, у вас есть набор с именем “myset”. Чтобы просканировать его элементы:
    SSCAN myset 0
  2. Использование команды MATCH:Чтобы отфильтровать элементы набора на основе шаблона и добавить некоторые элементы, включающие слово “манго” и другие вариации::
    SSCAN myset 0 MATCH mango:*
  3. Итерация по множеству:Для итерации по множеству можно использовать цикл:

#!/bin/bash
курсор=0
echo "Сканирование через myset:"
while true; do
# Сканирование набора
result=$(redis-cli SSCAN myset $cursor)
# Выведите элементы, возвращенные SSCAN
echo "$result"
# Обновление курсора для следующей итерации
cursor=$(echo "$result" | awk 'NR==1{print $1}')
# Прервите цикл, если курсор вернулся к 0
if [[ "$cursor" == "0" ]]; then
break
fi
done

Запуск сценария

  1. Сохраните сценарий под именем scan_myset.sh.
  2. Сделайте его исполняемым:
    chmod x scan_myset.sh
  3. Запустите скрипт:
    ./scan_myset.sh

Использование команд HSCAN и ZSCAN

Команда HSCAN

Команда HSCAN выполняет итерацию по полям и значениям в хэше:

HSCAN key cursor [MATCH pattern] [COUNT count]

Команда HSCAN используется для итерации по полям и значениям в хэше.

Шаг 1: Создание хэша и добавление полей

  1. Создайте хэш с именем myhash и добавьте в него несколько полей:
HSET myhash name "John Doe"
HSET myhash возраст "30"
HSET myhash профессия "Разработчик программного обеспечения"
HSET myhash город "Сан-Франциско"
HSET myhash страна "США"

Шаг 2: Используйте HSCAN для итерации по хэшу

  1. Используйте команду HSCAN для итерации по полям в myhash:
HSCAN myhash 0

Команда ZSCAN

ZSCAN – это команда Redis, используемая для инкрементного перебора членов отсортированного набора. Она позволяет эффективно и неблокируемо получать члены вместе с их ассоциированными оценками. Эта команда особенно полезна при работе с большими отсортированными наборами, когда получение всех членов сразу может быть нецелесообразным.

Команда ZSCAN выполняет итерацию по членам и оценкам в отсортированном наборе:

ZSCAN клавиша курсора [MATCH pattern] [COUNT count]

Шаг 1: Создание отсортированного набора и добавление его членов

Давайте создадим отсортированный набор под названием mysortedset и добавим в него несколько членов с оценками:

ZADD mysortedset 1 "яблоко"
ZADD mysortedset 2 "банан"
ZADD mysortedset 3 "вишня"

Основная команда ZSCAN:

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

ZSCAN mysortedset 0

Шаг 2: Использование MATCH для фильтрации членов (необязательно)

Если вы хотите отфильтровать члены, возвращаемые ZSCAN, вы можете использовать опцию MATCH. Например, чтобы найти членов, содержащих букву “e”, можно выполнить команду:

ZSCAN mysortedset 0 MATCH *e*

Лучшие практики использования команд scan

  1. Используйте SCAN вместо KEYS: избегайте использования команды KEYS в производстве, так как она может заблокировать сервер. Используйте SCAN для неблокирующей итерации.
  2. Комбинируйте с MATCH и COUNT: Используйте опции MATCH и COUNT для повышения производительности и ограничения набора результатов.
  3. Работайте с большими массивами данных: При работе с большими наборами данных обрабатывайте ключи партиями с помощью курсоров, чтобы эффективно использовать память.
  4. Тестируйте в процессе разработки: Всегда тестируйте логику scan в среде разработки, чтобы убедиться, что она ведет себя так, как ожидается, перед развертыванием в производстве.

Заключение

Использование команд scan в Redis позволяет эффективно итерировать большие наборы данных в среде Linux, не перегружая сервер. Поняв, как использовать SCAN, SSCAN, HSCAN и ZSCAN, вы сможете эффективно управлять и получать данные из Redis. Эти команды необходимы для создания масштабируемых приложений, требующих обработки данных в реальном времени. Для получения дополнительной информации и подробного описания использования обратитесь к официальной документации Redis и поэкспериментируйте с этими командами в своей среде Redis.