Sparen Sie 15% bei allen Hosting-Diensten

Teste deine Fähigkeiten und erhalte Rabatt auf jeden Hosting-Plan

Benutze den Code: Skills Anfangen
Abschnitte
Dedizierte Server Linux

Redis Scan-Befehle unter Linux verwenden: Ein vollständiger Leitfaden

Redis ist ein hochperformanter, quelloffener In-Memory-Datenspeicher, der häufig als Schlüssel-Wert-Datenbank, Cache und Message Broker verwendet wird. Zu seinen leistungsstärksten – aber oft untergenutzten – Funktionen gehören die Scan-Befehle, mit denen Sie große Datenmengen schrittweise durchlaufen können, ohne Ihren Server zu blockieren oder die Leistung zu beeinträchtigen.

Wenn Sie Redis auf einem Linux-basierten Server ausführen, ist die Beherrschung von Scan-Befehlen für die Erstellung skalierbarer, produktionsreifer Anwendungen unerlässlich. Im Gegensatz zum gefährlichen KEYS-Befehl, der alle übereinstimmenden Schlüssel in einer einzigen blockierenden Operation abruft, geben Scan-Befehle Daten in kleinen, verwaltbaren Batches zurück – was sie zum richtigen Werkzeug für jede Umgebung macht, die mit erheblichen Datenmengen umgeht.

In diesem umfassenden Leitfaden erfahren Sie genau, wie Sie SCAN, SSCAN, HSCAN und ZSCAN in Redis unter Linux verwenden, komplett mit realen Beispielen, Shell-Skripten und Best Practices für Produktionsbereitstellungen.

Was sind Redis Scan Commands?

Redis Scan Commands bieten einen cursor-basierten, nicht blockierenden Mechanismus zum Iterieren über Keys, Sets, Hashes und Sorted Sets. Jeder Befehl gibt eine kleine Teilmenge von Elementen pro Aufruf zusammen mit einem Cursor-Wert zurück, den Sie verwenden, um die Iteration in nachfolgenden Aufrufen fortzusetzen. Wenn der Cursor zu 0 zurückkehrt, wurde der gesamte Datensatz durchlaufen.

Dieser Ansatz ist grundlegend sicherer und effizienter als KEYS, das den gesamten Redis-Server blockiert, bis es das Scannen beendet — ein kritisches Problem in Produktionsumgebungen mit Millionen von Keys.

Die vier Core Scan Commands

BefehlZweck
SCANIteriert über Keys im gesamten Keyspace
SSCANIteriert über Elemente in einem Set
HSCANIteriert über Felder und Werte in einem Hash
ZSCANIteriert über Mitglieder und Scores in einem Sorted Set

Grundlegende Syntax von Scan-Befehlen

Alle vier Scan-Befehle verwenden eine konsistente Syntaxstruktur:

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]

Erklärung der Parameter

  • cursor — Eine Ganzzahl, die die aktuelle Position in der Iteration darstellt. Beginnen Sie immer mit 0, um einen neuen Scan zu starten. Redis gibt bei jeder Antwort einen neuen Cursor zurück; verwenden Sie ihn im nächsten Aufruf, um fortzufahren.
  • MATCH pattern *(optional)* — Filtert Ergebnisse mithilfe von Glob-ähnlichem Musterabgleich (z. B. user:*, *session*). Hinweis: Die Filterung erfolgt *nach* dem Abrufen, daher können Übereinstimmungen mit niedriger Dichte viele Iterationen erfordern.
  • COUNT count *(optional)* — Ein Hinweis für Redis, der vorschlägt, wie viele Elemente pro Iteration zurückgegeben werden sollen. Dies ist keine harte Grenze; Redis kann mehr oder weniger zurückgeben. Der Standard ist 10.

Redis unter Linux installieren

Bevor Sie Scan-Befehle verwenden, müssen Sie Redis auf Ihrem Linux-Server installiert und ausgeführt haben. Ob Sie sich in einer hochfrequentierten Produktionsumgebung oder auf einer Entwicklungsmaschine befinden, der Installationsprozess ist unkompliziert.

> Tipp: Für Produktionsworkloads, die Redis im großen Maßstab erfordern, sollten Sie die Bereitstellung auf einem VPS Hosting-Plan oder einem Dedicated Server in Betracht ziehen, um sicherzustellen, dass Sie über den Speicher, die CPU und die I/O-Ressourcen verfügen, die Redis benötigt.

Redis unter Debian/Ubuntu installieren

sudo apt update
sudo apt install redis-server -y

Redis unter CentOS/RHEL installieren

sudo yum install redis -y

Redis-Service starten

sudo systemctl start redis
sudo systemctl enable redis

Installation überprüfen

sudo systemctl status redis

Sie sollten active (running) in der Ausgabe sehen. Verbinden Sie sich jetzt mit der Redis CLI:

redis-cli

Sobald Sie sich in der CLI befinden, testen Sie die Verbindung:

127.0.0.1:6379> PING
PONG

Sie sind bereit, Scan-Befehle zu verwenden.

Verwendung des SCAN-Befehls

Der SCAN Befehl iteriert über alle Schlüssel im Redis-Keyspace. Er ist der universelle Ersatz für den KEYS Befehl in Produktionsumgebungen.

Beispiel 1: Grundlegende SCAN

Um mit dem Scannen aller Schlüssel in der Datenbank zu beginnen, starten Sie mit dem Cursor 0:

SCAN 0

Beispielausgabe:

1) "14"
2) 1) "session:abc123"
   2) "user:1001"
   3) "product:55"

Das erste Element (14) ist der nächste Cursor. Verwenden Sie ihn in Ihrem nächsten SCAN Aufruf. Wenn der zurückgegebene Cursor 0 ist, ist die vollständige Iteration abgeschlossen.

Beispiel 2: Filterung von Schlüsseln mit MATCH

Um nur Schlüssel abzurufen, die einem bestimmten Muster entsprechen – zum Beispiel alle Schlüssel mit dem Präfix user::

SCAN 0 MATCH user:*

Dies gibt nur Schlüssel zurück, deren Namen mit user: beginnen. Iterieren Sie weiter, bis der Cursor 0 zurückgibt, um sicherzustellen, dass Sie den gesamten Keyspace gescannt haben.

Beispiel 3: Steuerung der Batch-Größe mit COUNT

Um Redis zu empfehlen, ungefähr 100 Schlüssel pro Iteration zurückzugeben:

SCAN 0 COUNT 100

Denken Sie daran: COUNT ist ein *Hinweis*, keine Garantie. Redis kann je nach internen Datenstrukturen etwas mehr oder weniger Ergebnisse zurückgeben.

Beispiel 4: Vollständige Keyspace-Iteration mit einem Shell-Skript

In realen Szenarien müssen Sie den gesamten Keyspace programmgesteuert durchlaufen. Hier ist ein produktionsreifes Bash-Skript, das alle Schlüssel durchläuft, die einem Muster entsprechen:

#!/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

So führen Sie dieses Skript aus:

chmod +x scan_keys.sh
./scan_keys.sh

Verwendung des SSCAN-Befehls

SSCAN wird verwendet, um die Mitglieder eines Redis Set inkrementell zu durchlaufen. Es folgt dem gleichen Cursor-basierten Muster wie SCAN.

Schritt 1: Ein Set erstellen und Mitglieder hinzufügen

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"

Schritt 2: Grundlegendes SSCAN

Scannen Sie alle Elemente in myset beginnend mit dem Cursor 0:

SSCAN myset 0

Schritt 3: Elemente mit MATCH filtern

Um nur Elemente abzurufen, die dem Muster mango:* entsprechen:

SSCAN myset 0 MATCH mango:*

Schritt 4: Ein Set mit einem Shell-Skript durchlaufen

#!/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

Speichern Sie als scan_myset.sh, machen Sie es ausführbar und führen Sie es aus:

chmod +x scan_myset.sh
./scan_myset.sh

Verwendung des HSCAN-Befehls

HSCAN iteriert durch die Felder und Werte eines Redis Hash. Dies ist besonders nützlich, wenn ein Hash Hunderte oder Tausende von Feldern enthält und Sie diese verarbeiten müssen, ohne alles auf einmal in den Speicher zu laden.

Schritt 1: Einen Hash erstellen und Felder hinzufügen

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"

Schritt 2: Basis-HSCAN

HSCAN myhash 0

Beispielausgabe:

1) "0"
2) 1) "name"
   2) "John Doe"
   3) "age"
   4) "30"
   5) "occupation"
   6) "Software Developer"
   ...

Ergebnisse werden als abwechselnde Feld-Wert-Paare zurückgegeben.

Schritt 3: Hash-Felder mit MATCH filtern

Um nur Felder abzurufen, deren Namen "city" enthalten oder einem Muster entsprechen:

HSCAN myhash 0 MATCH *city*

Schritt 4: Iteration durch einen Hash mit einem Shell-Skript

#!/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

Verwendung des ZSCAN-Befehls

ZSCAN iteriert durch die Mitglieder und Scores eines Redis Sorted Set. Sorted Sets werden häufig für Leaderboards, Prioritätswarteschlangen und Zeitreihendaten verwendet — alle Szenarien, in denen das effiziente Scannen großer Sammlungen entscheidend ist.

Schritt 1: Erstellen Sie ein Sorted Set und fügen Sie Mitglieder hinzu

ZADD mysortedset 1 "apple"
ZADD mysortedset 2 "banana"
ZADD mysortedset 3 "cherry"
ZADD mysortedset 4 "date"
ZADD mysortedset 5 "elderberry"

Schritt 2: Basis-ZSCAN

ZSCAN mysortedset 0

Beispielausgabe:

1) "0"
2) 1) "apple"
   2) "1"
   3) "banana"
   4) "2"
   5) "cherry"
   6) "3"

Ergebnisse werden als abwechselnde Mitglieds-Score-Paare zurückgegeben.

Schritt 3: Mitglieder mit MATCH filtern

Um alle Mitglieder zu finden, deren Namen den Buchstaben "e" enthalten:

ZSCAN mysortedset 0 MATCH *e*

Schritt 4: Vollständiges Sorted-Set-Iterationsskript

#!/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 Command Comparison: Quick Reference

Funktion`SCAN``SSCAN``HSCAN``ZSCAN`
ZielAlle SchlüsselSet-MitgliederHash-Felder/WerteSorted-Set-Mitglieder/Scores
Erfordert SchlüsselnamenNeinJaJaJa
Unterstützt MATCHJaJaJaJa
Unterstützt COUNTJaJaJaJa
AusgabeformatSchlüsselnamenMember-StringsFeld-Wert-PaareMember-Score-Paare
BlockierungNeinNeinNeinNein

Best Practices für die Verwendung von Redis Scan-Befehlen in der Produktion

1. Verwenden Sie immer SCAN statt KEYS in der Produktion

Der KEYS Befehl ist Single-threaded und blockiert alle anderen Redis-Operationen bis zu seiner Fertigstellung. Bei einer Datenbank mit Millionen von Schlüsseln kann dies zu schwerwiegenden Latenzspitzen führen. Verwenden Sie KEYS niemals in der Produktion. SCAN ist die korrekte, nicht-blockierende Alternative.

2. Passen Sie COUNT basierend auf Ihrer Datensatzgröße an

Für kleine Datensätze (< 1.000 Schlüssel) ist der Standard-COUNT 10 ausreichend. Für große Datensätze erhöhen Sie COUNT auf 1001000, um die Anzahl der Round Trips zu reduzieren und gleichzeitig einzelne Antworten handhabbar zu halten.

3. Verlassen Sie sich nicht allein auf MATCH für Effizienz

Der MATCH Filter wird *nach* dem internen Abrufen von Elementen durch Redis angewendet. Wenn Ihr Muster nur einen kleinen Teil der Schlüssel erfasst, scannt Redis dennoch intern den gesamten Datensatz. Verwenden Sie Benennungskonventionen für Schlüssel (z. B. konsistente Präfixe), um MATCH effektiver zu gestalten.

4. Verarbeiten Sie Ergebnisse in Batches

Sammeln Sie niemals alle Scan-Ergebnisse im Speicher an, bevor Sie sie verarbeiten. Verarbeiten Sie stattdessen jeden Batch sofort nach seiner Rückgabe. Dies ist besonders wichtig auf speicherbeschränkten Servern.

5. Behandeln Sie den Cursor-Status sorgfältig

Initialisieren Sie den Cursor immer mit 0 und aktualisieren Sie ihn mit jeder Antwort. Wenn Ihre Anwendung während eines Scans abstürzt, starten Sie von 0 neu. Redis-Cursor sind nicht persistent über Server-Neustarts hinweg.

6. Testen Sie gründlich in der Entwicklung zuerst

Bevor Sie Scan-basierte Logik in der Produktion bereitstellen, validieren Sie sie in einer Staging-Umgebung mit einem repräsentativen Datensatz. Überprüfen Sie, dass Ihre Schleife korrekt beendet wird, wenn der Cursor zu 0 zurückkehrt.

7. Sichern Sie Ihre Redis-Instanz

Redis sollte niemals ohne Authentifizierung dem öffentlichen Internet ausgesetzt werden. Verwenden Sie requirepass in Ihrer Redis-Konfiguration, binden Sie an localhost oder eine private Netzwerkschnittstelle und verwenden Sie Firewall-Regeln, um den Zugriff zu beschränken.

Die richtige Hosting-Umgebung für Redis wählen

Die Redis-Leistung ist direkt an verfügbaren RAM, CPU-Geschwindigkeit und Netzwerklatenzen gebunden. Die Wahl der richtigen Hosting-Infrastruktur ist genauso wichtig wie das Schreiben effizienter Redis-Befehle.

  • Entwicklung und kleine Projekte: Shared Web Hosting kann für leichte Redis-Nutzung ausreichen, obwohl dedizierte Redis-Instanzen immer vorzuziehen sind.
  • Wachsende Anwendungen: Ein VPS Hosting Plan bietet dir dedizierte Ressourcen, Root-Zugriff und die Möglichkeit, die Redis-Konfiguration (maxmemory, Persistenzeinstellungen, etc.) genau nach deinen Anforderungen anzupassen.
  • Hochlast-Produktionssysteme: Dedicated Servers bieten maximale RAM- und CPU-Ressourcen, die Redis nutzen kann, und eliminieren Ressourcenkonflikte vollständig.
  • KI- und ML-Workloads mit Redis als Vektorspeicher: GPU Hosting bietet die Rechenleistung, die für die Embedding-Generierung und Ähnlichkeitssuche neben Redis erforderlich ist.

Für Anwendungen, die auch ein Web-Kontrollpanel für einfachere Verwaltung benötigen, bietet VPS mit cPanel eine benutzerfreundliche Oberfläche neben vollständiger Serverkontrolle.

Fehlerbehebung bei häufigen Problemen

SCAN gibt wiederholt 0 Elemente zurück

Dies bedeutet normalerweise, dass Ihr MATCH Muster keine Schlüssel entspricht, oder der Datensatz ist leer. Überprüfen Sie Ihre Schlüsselbenennung mit DBSIZE, um die Gesamtanzahl der Schlüssel zu überprüfen.

127.0.0.1:6379> DBSIZE
(integer) 15420

Cursor kehrt nie zu 0 zurück

Dies sollte in einer stabilen Redis-Instanz nicht vorkommen. Falls doch, überprüfen Sie die Redis-Versionkompatibilität (Scan-Befehle erfordern Redis 2.8+) oder Verbindungsunterbrechungen, die Ihr Cursor-Tracking zurücksetzen.

Skript hängt unbegrenzt

Stellen Sie sicher, dass Ihre Schleife den Cursor korrekt aus der ersten Zeile der redis-cli Ausgabe liest. Ein Parsing-Fehler, der immer einen Cursor ungleich Null erzeugt, verursacht eine Endlosschleife.

Fazit

Redis Scan-Befehle — SCAN, SSCAN, HSCAN und ZSCAN — sind unverzichtbare Werkzeuge für jeden Entwickler oder Systemadministrator, der mit Redis im großen Maßstab unter Linux arbeitet. Sie bieten einen sicheren, nicht-blockierenden, cursor-basierten Mechanismus zum Durchlaufen großer Datensätze ohne die Leistungsrisiken, die mit Befehlen wie KEYS verbunden sind.

Durch die Kombination von Scan-Befehlen mit MATCH Mustern, geeigneten COUNT Hinweisen und gut strukturierten Shell-Skripten können Sie effiziente Datenverarbeitungspipelines erstellen, die sich elegant mit Ihrer Datensatzgröße skalieren. Die Befolgung der in diesem Leitfaden beschriebenen Best Practices — besonders in Bezug auf Produktionssicherheit, Speicherverwaltung und Infrastrukturauswahl — stellt sicher, dass Ihre Redis-Bereitstellungen leistungsfähig und zuverlässig bleiben.

Für die aktuellsten Befehlsoptionen und erweiterte Konfigurationsdetails konsultieren Sie immer die offizielle Redis-Dokumentation. Und wenn Sie bereit sind, Redis in einer produktionsgerechten Linux-Umgebung bereitzustellen, erkunden Sie AlexHost’s VPS Hosting und Dedicated Servers für eine Infrastruktur, die für anspruchsvolle, speicherintensive Workloads ausgelegt ist.