Заощадьте 15% на всіх хостингових послугах

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код: Skills Почати
Рубрики
Linux Виділені сервери

Використання команд 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 до 1001000, щоб зменшити кількість циклів обміну даними, зберігаючи керованість окремих відповідей.

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 для інфраструктури, побудованої для обробки вимогливих, ресурсомістких робочих навантажень.