Використання команд Redis Scan на Linux: Повний посібник
Redis — це високопродуктивне, відкрите програмне забезпечення, сховище структур даних в пам’яті, широко використовується як база даних ключ-значення, кеш та брокер повідомлень. Серед його найпотужніших — але часто недовикористовуваних — функцій є команди сканування, які дозволяють вам поступово перебирати великі набори даних без блокування вашого сервера або погіршення продуктивності.
Якщо ви запускаєте Redis на сервері на базі Linux, оволодіння командами сканування є важливим для створення масштабованих, готових до виробництва додатків. На відміну від небезпечної команди KEYS, яка отримує всі відповідні ключі в одній операції блокування, команди сканування повертають дані невеликими, керованими партіями — що робить їх правильним інструментом для будь-якого середовища, яке обробляє значні обсяги даних.
У цьому комплексному посібнику ви дізнаєтесь, як саме використовувати SCAN, SSCAN, HSCAN та ZSCAN в Redis на Linux, з реальними прикладами, shell-скриптами та найкращими практиками для розгортання у виробництві.
Що таке команди Redis Scan?
Команди Redis scan забезпечують механізм на основі курсора без блокування для ітерації по ключах, наборах, хешах та відсортованих наборах. Кожна команда повертає невелику підмножину елементів за один виклик разом зі значенням курсора, яке ви використовуєте для продовження ітерації в наступних викликах. Коли курсор повертає 0, весь набір даних був пройдений.
Цей підхід принципово безпечніший та ефективніший за KEYS, який блокує весь сервер Redis до завершення сканування — критична проблема в виробничих середовищах з мільйонами ключів.
Чотири основні команди Scan
| Команда | Призначення |
|---|---|
SCAN | Ітерує по ключах у всьому просторі ключів |
SSCAN | Ітерує по елементам у Наборі |
HSCAN | Ітерує по полям та значенням у Хеші |
ZSCAN | Ітерує по членам та оцінкам у Відсортованому наборі |
Базовий синтаксис команд сканування
Усі чотири команди сканування мають послідовну структуру синтаксису:
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 сервері. Незалежно від того, чи ви працюєте у високонавантаженому виробничому середовищі чи на машині розробки, процес встановлення простий.
> Порада: Для виробничих навантажень, які вимагають Redis у масштабі, розгляньте можливість розгортання на плані VPS Hosting або на Dedicated Server, щоб забезпечити пам’ять, CPU та ресурси I/O, які потребує Redis.
Встановлення 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: повна ітерація простору ключів за допомогою сценарію оболонки
У реальних сценаріях вам потрібно буде циклічно перебирати весь простір ключів програмно. Ось готовий до виробництва сценарій 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: Створення Hash та додавання полів
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: Фільтрування полів Hash за допомогою MATCH
Щоб отримати лише поля, імена яких містять "city" або відповідають шаблону:
HSCAN myhash 0 MATCH *city*Крок 4: Перебір Hash за допомогою 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 Sorted Set. Відсортовані набори зазвичай використовуються для таблиць лідерів, черг пріоритетів та даних часових рядів — усі сценарії, де критична ефективна сканування великих колекцій.
Крок 1: Створення Sorted Set та додавання членів
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: Скрипт повної ітерації Sorted Set
#!/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: Швидкий довідник
| Функція | `SCAN` | `SSCAN` | `HSCAN` | `ZSCAN` |
|---|---|---|---|---|
| Ціль | Усі ключі | Члени набору | Поля/значення хешу | Члени/оцінки відсортованого набору |
| Вимагає назву ключа | Ні | Так | Так | Так |
| Підтримує MATCH | Так | Так | Так | Так |
| Підтримує COUNT | Так | Так | Так | Так |
| Формат виводу | Назви ключів | Рядки членів | Пари поле-значення | Пари член-оцінка |
| Блокування | Ні | Ні | Ні | Ні |
Найкращі практики використання команд Redis Scan у виробництві
1. Завжди використовуйте SCAN замість KEYS у виробництві
Команда KEYS є однопотоковою і блокує всі інші операції Redis, поки вона не завершиться. На базі даних з мільйонами ключів це може спричинити серйозні сплески затримки. Ніколи не використовуйте KEYS у виробництві. SCAN є правильною, неблокуючою альтернативою.
2. Налаштуйте COUNT на основі розміру вашого набору даних
Для малих наборів даних (< 1,000 ключів) стандартне значення COUNT 10 підходить. Для великих наборів даних збільшіть COUNT до 100–1000, щоб зменшити кількість циклів обміну даними, зберігаючи керованість окремих відповідей.
3. Не покладайтеся лише на MATCH для ефективності
Фільтр MATCH застосовується *після* того, як Redis внутрішньо отримає елементи. Якщо ваш шаблон відповідає лише невеликій частині ключів, Redis все одно внутрішньо сканує весь набір даних. Використовуйте конвенції найменування ключів (наприклад, послідовні префікси), щоб зробити MATCH більш ефективним.
4. Обробляйте результати партіями
Ніколи не накопичуйте всі результати сканування в пам’яті перед обробкою. Замість цього обробляйте кожну партію негайно, коли вона повертається. Це особливо важливо на серверах з обмеженою пам’яттю.
5. Обережно обробляйте стан курсора
Завжди ініціалізуйте курсор на 0 і оновлюйте його з кожною відповіддю. Якщо ваша програма зупиниться під час сканування, перезапустіть з 0. Курсори Redis не зберігаються після перезавантаження сервера.
6. Ретельно протестуйте спочатку у розробці
Перед розгортанням логіки на основі сканування у виробництво, перевірте її в середовищі staging з репрезентативним набором даних. Переконайтеся, що ваш цикл правильно завершується, коли курсор повертається до 0.
7. Захистіть вашу інстанцію Redis
Redis ніколи не повинна бути доступна в публічному інтернеті без аутентифікації. Використовуйте requirepass у вашій конфігурації Redis, прив’яжіть до localhost або приватного мережевого інтерфейсу та використовуйте правила брандмауера для обмеження доступу.
Вибір правильного хостинг-середовища для Redis
Продуктивність Redis безпосередньо залежить від доступної RAM, швидкості CPU та затримки мережі. Вибір правильної хостинг-інфраструктури так само важливий, як написання ефективних команд Redis.
- Розробка та невеликі проекти: Shared Web Hosting може бути достатнім для легкого використання Redis, хоча виділені екземпляри Redis завжди переважні.
- Зростаючі додатки: План VPS Hosting надає вам виділені ресурси, root-доступ та можливість налаштування конфігурації Redis (
maxmemory, параметри збереження тощо) відповідно до ваших потреб. - Високонавантажені виробничі системи: Dedicated Servers забезпечують максимальну RAM та ресурси CPU, які Redis може використовувати, повністю усуваючи конкуренцію за ресурси.
- Робочі навантаження AI та ML, які використовують Redis як сховище векторів: GPU Hosting пропонує обчислювальну потужність, необхідну для генерування вбудовування та пошуку подібності поряд з Redis.
Для додатків, які також потребують веб-панелі керування для простішого управління, VPS з cPanel забезпечує зручний інтерфейс поряд з повним контролем сервера.
Усунення поширених проблем
SCAN повертає 0 елементів повторно
Це зазвичай означає, що ваш MATCH pattern не відповідає жодним ключам, або набір даних порожній. Перевірте назви ключів за допомогою DBSIZE для перевірки загальної кількості ключів.
127.0.0.1:6379> DBSIZE
(integer) 15420Курсор ніколи не повертається до 0
Це не повинно відбуватися в стабільному екземплярі Redis. Якщо це трапляється, перевірте сумісність версії Redis (команди scan потребують Redis 2.8+) або переривання з’єднання, які скидають відстеження курсора.
Скрипт зависає на невизначений час
Переконайтеся, що ваш цикл правильно читає курсор з першого рядка виходу redis-cli. Помилка аналізу, яка завжди видає ненульовий курсор, спричинить нескінченний цикл.
Висновок
Redis scan команди — SCAN, SSCAN, HSCAN та ZSCAN — є незамінними інструментами для будь-якого розробника або системного адміністратора, який працює з Redis у великому масштабі на Linux. Вони забезпечують безпечний, неблокуючий механізм на основі курсора для ітерації через великі набори даних без ризиків для продуктивності, пов’язаних з командами на кшталт KEYS.
Поєднуючи scan команди з MATCH шаблонами, відповідними COUNT підказками та добре структурованими shell скриптами, ви можете побудувати ефективні конвеєри обробки даних, які масштабуються плавно з розміром вашого набору даних. Дотримання найкращих практик, описаних у цьому посібнику — особливо щодо безпеки в продакшені, управління пам’яттю та вибору інфраструктури — забезпечить, що ваші Redis розгортання залишатимуться продуктивними та надійними.
Для найактуальніших параметрів команд та деталей розширеної конфігурації завжди звертайтеся до офіційної документації Redis. І коли ви будете готові розгорнути Redis у виробничому середовищі Linux, дослідіть VPS Hosting та Dedicated Servers AlexHost для інфраструктури, побудованої для обробки вимогливих, ресурсомістких робочих навантажень.
на всіх хостингових послугах