Спестете 15% от всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код: Skills За начало
Заглавия
Linux Специализирани сървъри

Използване на Redis Scan Commands на Linux: Пълно ръководство

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

Ако работите с Redis на Linux-базиран сървър, овладяването на scan командите е от съществено значение за изграждането на мащабируеми, готови за производство приложения. За разлика от опасната KEYS команда, която извлича всички съответстващи ключове в една блокираща операция, scan командите връщат данни в малки, управляеми партиди — което ги прави правилния инструмент за всяка среда, която обработва значителни обеми данни.

В този всеобхватен наръчник ще научите точно как да използвате 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 сървър. Независимо дали сте в среда с висок трафик или на машина за разработка, процесът на инсталиране е прост.

> Съвет: За production работни натоварвания, които изискват 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 keyspace. Това е общоназначената замяна на командата 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, за да се уверите, че сте сканирали целия keyspace.

Пример 3: Контролиране на размера на партидата с COUNT

За да предложите на Redis да върне приблизително 100 ключа на итерация:

SCAN 0 COUNT 100

Помнете: COUNT е *подсказка*, не гаранция. Redis може да върне малко повече или по-малко резултати в зависимост от вътрешните структури на данни.

Пример 4: Пълна итерация на Keyspace с Shell скрипт

В реални сценарии ще трябва да преминете през целия keyspace програмно. Ето един готов за производство 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. Това е особено полезно, когато един 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 команди в 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. Тестирайте внимателно в Development първо

Преди да разгърнете логика, базирана на сканиране, в production, валидирайте я в staging среда с представителен набор от данни. Проверете, че вашата цикъл правилно се прекратява, когато курсорът се върне на 0.

7. Защитете вашата Redis инстанция

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

Избор на правилната хостинг среда за Redis

Производителността на Redis е пряко свързана с наличния RAM, скоростта на CPU и мрежовата латентност. Избирането на правилната хостинг инфраструктура е толкова важно, колкото писането на ефективни Redis команди.

  • Разработка и малки проекти: Споделен уеб хостинг може да е достатъчен за лека употреба на Redis, въпреки че специализирани Redis инстанции винаги са предпочитани.
  • Растящи приложения: План за VPS хостинг ви дава специализирани ресурси, root достъп и възможност да настроите Redis конфигурация (maxmemory, настройки на персистентност и т.н.) според вашите точни нужди.
  • Системи с висок трафик в production: Специализирани сървъри предоставят максималния RAM и CPU ресурси, които Redis може да използва, елиминирайки напълно конкуренцията за ресурси.
  • AI и ML работни натоварвания, използващи Redis като вектор хранилище: GPU хостинг предлага изчислителната мощност, необходима за генериране на вложения и търсене на сходство наред с 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 команди — SCAN, SSCAN, HSCAN и ZSCAN — са незаменими инструменти за всеки разработчик или системен администратор, работещ с Redis в мащаб на Linux. Те осигуряват безопасен, неблокиращ механизъм, базиран на курсор, за итериране през големи набори от данни без рисковете за производителност, свързани с команди като KEYS.

Чрез комбиниране на scan команди с MATCH модели, подходящи COUNT подсказки и добре структурирани shell скриптове, можете да изградите ефективни конвейери за обработка на данни, които се мащабират грациозно с размера на вашия набор от данни. Следването на най-добрите практики, описани в това ръководство — особено по отношение на безопасността на производството, управлението на паметта и избора на инфраструктура — ще гарантира, че вашите Redis разгръщания остават производителни и надеждни.

За най-актуалните опции на команди и напреднали детайли на конфигурацията, винаги консултирайте официалната документация на Redis. И когато сте готови да разгърнете Redis в производствена среда на Linux, изследвайте VPS Hosting и Dedicated Servers на AlexHost за инфраструктура, изградена да се справя с търсещи, памет-интензивни работни натоварвания.