Использование команд 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 до 100–1000, чтобы уменьшить количество круговых поездок, сохраняя управляемый размер отдельных ответов.
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 для инфраструктуры, созданной для обработки требовательных рабочих нагрузок, требующих большого объема памяти.
на всех хостинговых услугах