Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код: Skills Начать
Рубрики
Linux Выделенные

Использование команд Redis Scan на Linux: полное руководство

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

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

В этом подробном руководстве вы узнаете, как именно использовать SCAN, SSCAN, HSCAN и ZSCAN в Redis на Linux, с реальными примерами, shell-скриптами и лучшими практиками для развертывания в производстве.

Что такое команды Redis Scan?

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

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

Четыре основные команды Scan

КомандаНазначение
SCANИтерирует по ключам во всем пространстве ключей
SSCANИтерирует по элементам в Set
HSCANИтерирует по полям и значениям в Hash
ZSCANИтерирует по членам и оценкам в Sorted Set

Базовый синтаксис команд сканирования

Все четыре команды сканирования имеют согласованную структуру синтаксиса:

SCAN cursor [MATCH pattern] [COUNT count]
SSCAN key cursor [MATCH pattern] [COUNT count]
HSCAN key cursor [MATCH pattern] [COUNT count]
ZSCAN key cursor [MATCH pattern] [COUNT count]

Объяснение параметров

  • cursor — целое число, представляющее текущую позицию в итерации. Всегда начинайте с 0 для начала нового сканирования. Redis возвращает новый курсор с каждым ответом; используйте его в следующем вызове для продолжения.
  • MATCH pattern *(опционально)* — фильтрует результаты с использованием сопоставления шаблонов в стиле glob (например, user:*, *session*). Примечание: фильтрация происходит *после* извлечения, поэтому совпадения с низкой плотностью могут потребовать много итераций.
  • COUNT count *(опционально)* — подсказка для Redis, предлагающая, сколько элементов возвращать за итерацию. Это не жесткое ограничение; Redis может вернуть больше или меньше. По умолчанию 10.

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

Перед использованием команд scan вам необходимо установить и запустить Redis на вашем сервере Linux. Независимо от того, работаете ли вы в высоконагруженной production среде или на машине разработки, процесс установки прост.

> Совет: Для production рабочих нагрузок, требующих Redis в масштабе, рассмотрите возможность развертывания на плане VPS Hosting или Dedicated Server, чтобы обеспечить необходимые Redis память, CPU и ресурсы I/O.

Установка Redis на Debian/Ubuntu

sudo apt update
sudo apt install redis-server -y

Установка Redis на CentOS/RHEL

sudo yum install redis -y

Запуск сервиса Redis

sudo systemctl start redis
sudo systemctl enable redis

Проверка установки

sudo systemctl status redis

Вы должны увидеть active (running) в выводе. Теперь подключитесь к Redis CLI:

redis-cli

После входа в CLI протестируйте соединение:

127.0.0.1:6379> PING
PONG

Вы готовы начать использовать команды scan.

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

Команда SCAN выполняет итерацию по всем ключам в пространстве ключей Redis. Это универсальная замена команде KEYS в производственных окружениях.

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

Чтобы начать сканирование всех ключей в базе данных, начните с курсора 0:

SCAN 0

Пример вывода:

1) "14"
2) 1) "session:abc123"
   2) "user:1001"
   3) "product:55"

Первый элемент (14) — это следующий курсор. Используйте его в следующем вызове SCAN. Когда возвращаемый курсор равен 0, полная итерация завершена.

Пример 2: Фильтрация ключей с помощью MATCH

Чтобы получить только ключи, соответствующие определённому шаблону — например, все ключи с префиксом user::

SCAN 0 MATCH user:*

Это возвращает только ключи, имена которых начинаются с user:. Продолжайте итерацию до тех пор, пока курсор не вернёт 0, чтобы убедиться, что вы отсканировали всё пространство ключей.

Пример 3: Управление размером пакета с помощью COUNT

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

SCAN 0 COUNT 100

Помните: COUNT — это *подсказка*, а не гарантия. Redis может вернуть немного больше или меньше результатов в зависимости от внутренних структур данных.

Пример 4: Полная итерация пространства ключей с помощью скрипта Shell

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

#!/bin/bash

cursor=0
echo "Starting full keyspace scan..."

while true; do
    # Execute SCAN and capture the result
    result=$(redis-cli SCAN $cursor MATCH user:* COUNT 100)

    # Extract the new cursor (first line of output)
    cursor=$(echo "$result" | head -n 1)

    # Extract and display the keys (remaining lines)
    keys=$(echo "$result" | tail -n +2)
    echo "Keys found:"
    echo "$keys"

    # Break the loop when cursor returns to 0
    if [[ "$cursor" == "0" ]]; then
        echo "Scan complete."
        break
    fi
done

Для запуска этого скрипта:

chmod +x scan_keys.sh
./scan_keys.sh

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

SSCAN используется для постепенного перебора членов Redis Set. Он следует тому же шаблону на основе курсора, что и SCAN.

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

SADD myset "apple"
SADD myset "banana"
SADD myset "cherry"
SADD myset "date"
SADD myset "elderberry"
SADD myset "mango"
SADD myset "mango:tropical"
SADD myset "mango:dried"

Шаг 2: Базовый SSCAN

Сканируйте все элементы в myset начиная с курсора 0:

SSCAN myset 0

Шаг 3: Фильтрация элементов с помощью MATCH

Для получения только элементов, соответствующих шаблону mango:*:

SSCAN myset 0 MATCH mango:*

Шаг 4: Перебор Set с помощью Shell-скрипта

#!/bin/bash

cursor=0
echo "Scanning through myset:"

while true; do
    # Scan the set
    result=$(redis-cli SSCAN myset $cursor COUNT 10)

    # Update cursor
    cursor=$(echo "$result" | head -n 1)

    # Print elements returned
    elements=$(echo "$result" | tail -n +2)
    echo "Elements: $elements"

    # Stop when cursor returns to 0
    if [[ "$cursor" == "0" ]]; then
        echo "Set scan complete."
        break
    fi
done

Сохраните как scan_myset.sh, сделайте исполняемым и запустите:

chmod +x scan_myset.sh
./scan_myset.sh

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

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

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

HSET myhash name "John Doe"
HSET myhash age "30"
HSET myhash occupation "Software Developer"
HSET myhash city "San Francisco"
HSET myhash country "USA"
HSET myhash email "john@example.com"

Шаг 2: Базовый HSCAN

HSCAN myhash 0

Пример вывода:

1) "0"
2) 1) "name"
   2) "John Doe"
   3) "age"
   4) "30"
   5) "occupation"
   6) "Software Developer"
   ...

Результаты возвращаются как чередующиеся пары поле-значение.

Шаг 3: Фильтрация полей хеша с помощью MATCH

Для получения только полей, имена которых содержат "city" или соответствуют шаблону:

HSCAN myhash 0 MATCH *city*

Шаг 4: Итерация по хешу с помощью скрипта Shell

#!/bin/bash

cursor=0
echo "Scanning hash: myhash"

while true; do
    result=$(redis-cli HSCAN myhash $cursor COUNT 10)
    cursor=$(echo "$result" | head -n 1)
    fields=$(echo "$result" | tail -n +2)

    echo "Fields and values:"
    echo "$fields"

    if [[ "$cursor" == "0" ]]; then
        echo "Hash scan complete."
        break
    fi
done

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

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

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

ZADD mysortedset 1 "apple"
ZADD mysortedset 2 "banana"
ZADD mysortedset 3 "cherry"
ZADD mysortedset 4 "date"
ZADD mysortedset 5 "elderberry"

Шаг 2: Базовый ZSCAN

ZSCAN mysortedset 0

Пример вывода:

1) "0"
2) 1) "apple"
   2) "1"
   3) "banana"
   4) "2"
   5) "cherry"
   6) "3"

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

Шаг 3: Фильтрация членов с помощью MATCH

Чтобы найти всех членов, чьи имена содержат букву "e":

ZSCAN mysortedset 0 MATCH *e*

Шаг 4: Полный скрипт итерации отсортированного набора

#!/bin/bash

cursor=0
echo "Scanning sorted set: mysortedset"

while true; do
    result=$(redis-cli ZSCAN mysortedset $cursor COUNT 10)
    cursor=$(echo "$result" | head -n 1)
    members=$(echo "$result" | tail -n +2)

    echo "Members and scores:"
    echo "$members"

    if [[ "$cursor" == "0" ]]; then
        echo "Sorted set scan complete."
        break
    fi
done

Сравнение команд сканирования: краткий справочник

Функция`SCAN``SSCAN``HSCAN``ZSCAN`
ЦельВсе ключиЧлены набораПоля/значения хешаЧлены/оценки отсортированного набора
Требует имя ключаНетДаДаДа
Поддерживает MATCHДаДаДаДа
Поддерживает COUNTДаДаДаДа
Формат выводаИмена ключейСтроки членовПары поле-значениеПары член-оценка
БлокированиеНетНетНетНет

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

1. Всегда используйте SCAN вместо KEYS в production

Команда KEYS является однопоточной и блокирует все остальные операции Redis до завершения. На базе данных с миллионами ключей это может вызвать серьёзные скачки задержки. Никогда не используйте KEYS в production. SCAN — это правильная, неблокирующая альтернатива.

2. Настройте COUNT в зависимости от размера вашего набора данных

Для небольших наборов данных (< 1 000 ключей) значение по умолчанию COUNT 10 подходит. Для больших наборов данных увеличьте COUNT до 1001000, чтобы уменьшить количество круговых поездок, сохраняя управляемый размер отдельных ответов.

3. Не полагайтесь только на MATCH для эффективности

Фильтр MATCH применяется *после* того, как Redis внутренне получит элементы. Если ваш шаблон соответствует только небольшой части ключей, Redis всё равно внутренне сканирует весь набор данных. Используйте соглашения об именовании ключей (например, согласованные префиксы), чтобы сделать MATCH более эффективным.

4. Обрабатывайте результаты партиями

Никогда не накапливайте все результаты сканирования в памяти перед обработкой. Вместо этого обрабатывайте каждую партию немедленно по мере её возврата. Это особенно важно на серверах с ограниченной памятью.

5. Осторожно обрабатывайте состояние курсора

Всегда инициализируйте курсор на 0 и обновляйте его с каждым ответом. Если ваше приложение упадёт во время сканирования, перезагрузитесь с 0. Курсоры Redis не сохраняются при перезагрузке сервера.

6. Тщательно протестируйте в разработке сначала

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

7. Защитите свой экземпляр Redis

Redis никогда не должен быть открыт в общедоступный интернет без аутентификации. Используйте requirepass в конфигурации Redis, привяжитесь к localhost или интерфейсу приватной сети и используйте правила брандмауэра для ограничения доступа.

Выбор правильной среды хостинга для Redis

Производительность Redis напрямую зависит от доступной памяти RAM, скорости CPU и задержки сети. Выбор правильной инфраструктуры хостинга так же важен, как написание эффективных команд Redis.

  • Разработка и небольшие проекты: Shared Web Hosting может быть достаточным для легкого использования Redis, хотя выделенные экземпляры Redis всегда предпочтительнее.
  • Растущие приложения: План VPS Hosting предоставляет вам выделенные ресурсы, root-доступ и возможность настроить конфигурацию Redis (maxmemory, параметры сохранения и т. д.) в соответствии с вашими потребностями.
  • Высоконагруженные production-системы: Dedicated Servers предоставляют максимальное количество RAM и ресурсов CPU, которые может использовать Redis, полностью исключая конкуренцию за ресурсы.
  • Рабочие нагрузки AI и ML с использованием Redis в качестве хранилища векторов: GPU Hosting предоставляет вычислительную мощность, необходимую для генерации embeddings и поиска сходства наряду с Redis.

Для приложений, которым также требуется веб-панель управления для более удобного управления, VPS с cPanel предоставляет удобный интерфейс наряду с полным контролем сервера.

Устранение распространённых проблем

SCAN возвращает 0 элементов повторно

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

127.0.0.1:6379> DBSIZE
(integer) 15420

Курсор никогда не возвращается к 0

Это не должно происходить в стабильном экземпляре Redis. Если это происходит, проверьте совместимость версии Redis (команды scan требуют Redis 2.8+) или прерывания соединения, сбрасывающие отслеживание курсора.

Скрипт зависает бесконечно

Убедитесь, что ваш цикл правильно читает курсор из первой строки выходных данных redis-cli. Ошибка синтаксического анализа, которая всегда производит ненулевой курсор, вызовет бесконечный цикл.

Заключение

Команды сканирования Redis — SCAN, SSCAN, HSCAN и ZSCAN — являются незаменимыми инструментами для любого разработчика или системного администратора, работающего с Redis в масштабе на Linux. Они обеспечивают безопасный, неблокирующий механизм на основе курсора для итерации по большим наборам данных без рисков производительности, связанных с командами, такими как KEYS.

Комбинируя команды сканирования с шаблонами MATCH, соответствующими подсказками COUNT и хорошо структурированными shell-скриптами, вы можете создавать эффективные конвейеры обработки данных, которые масштабируются в соответствии с размером вашего набора данных. Следуя лучшим практикам, описанным в этом руководстве — особенно в отношении безопасности в production, управления памятью и выбора инфраструктуры — вы обеспечите, что ваши развертывания Redis останутся производительными и надежными.

Для получения наиболее актуальной информации о параметрах команд и расширенных деталях конфигурации всегда обращайтесь к официальной документации Redis. И когда вы будете готовы развернуть Redis в production-среде Linux, изучите VPS Hosting и Dedicated Servers AlexHost для инфраструктуры, созданной для обработки требовательных рабочих нагрузок, требующих большого объема памяти.