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