RESP3-Protokoll: was sich gegenüber RESP2 in der Praxis ändert
AI generated
SET
TTL
Redis · RESP3 · Protokoll
RESP3-Protokoll
was sich gegenüber RESP2 in der Praxis ändert

Seit Redis 6 steht mit RESP3 eine überarbeitete Version des Redis-Protokolls zur Verfügung, die deutlich mehr strukturierte Datentypen kennt als das seit Jahrzehnten etablierte RESP2. Für Anwendungen, die Redis nur über eine ausgereifte Client-Bibliothek ansprechen, bleibt vieles davon unsichtbar, doch wer eigene Serialisierung schreibt, Client-Side Caching nutzen möchte oder einfach verstehen will, warum manche Werte plötzlich als Double statt als String zurückkommen, sollte die praktischen Unterschiede kennen. Dieser Artikel zeigt, welche neuen Datentypen RESP3 einführt, wie es um die Kompatibilität der Client-Bibliotheken steht und was sich bei einer Umstellung konkret ändert.

11 Min. Lesezeit RESP3 · RESP2 HELLO · Push-Nachrichten

1. Die Ausgangslage: RESP2 als jahrzehntelanger Standard

RESP2, das Redis Serialization Protocol in seiner zweiten Version, ist seit den frühesten Redis-Versionen im Einsatz und kennt nur eine überschaubare Anzahl grundlegender Antworttypen: einfache Strings, Fehler, Ganzzahlen, Bulk Strings für binäre oder längere Textdaten und Arrays, die verschachtelt werden können, um komplexere Strukturen wie Hash- oder Sorted-Set-Antworten abzubilden. Alles, was semantisch mehr Struktur hätte, etwa eine Zuordnung von Schlüsseln zu Werten, wird als flaches Array mit abwechselnd Schlüssel und Wert kodiert, und die Client-Bibliothek muss selbst wissen, dass ein bestimmter Befehl ein solches Array eigentlich als Map interpretieren sollte.

Diese Einfachheit war lange ein Vorteil, weil sie das Protokoll leicht zu implementieren machte, führte aber dazu, dass die eigentliche Datenstruktur eines Befehlsergebnisses implizit im Wissen der Client-Bibliothek steckte statt explizit im Protokoll selbst. Für neue Datentypen wie Doubles bei ZSCORE oder echte Boolesche Werte gab es in RESP2 keine eigene Repräsentation, sie wurden als Bulk String oder Ganzzahl kodiert und mussten von der Anwendung selbst interpretiert werden.

2. Neue Datentypen in RESP3: Maps, Sets, Doubles und mehr

RESP3 führt eine Reihe expliziter neuer Typen ein, die semantisch genauer abbilden, was ein Befehl tatsächlich zurückgibt. Der Map-Typ, eingeleitet mit %, kodiert Schlüssel-Wert-Zuordnungen explizit als solche, statt sie als flaches Array zu tarnen, sodass etwa HGETALL unter RESP3 eine echte Map statt eines Arrays zurückliefert. Der Set-Typ, eingeleitet mit ~, macht dasselbe für Befehle wie SMEMBERS, deren Ergebnis semantisch eine ungeordnete Menge ohne Duplikate ist.

Für Zahlen mit Nachkommastellen führt RESP3 den Double-Typ mit dem Präfix , ein, sodass Befehle wie ZSCORE nun einen echten Gleitkommawert liefern, den Client-Bibliotheken direkt als Zahl parsen können, statt einen Bulk String manuell in eine Zahl umwandeln zu müssen. Zusätzlich gibt es einen Boolean-Typ mit dem Präfix #, einen Big-Number-Typ mit ( für Werte, die den Wertebereich normaler 64-Bit-Ganzzahlen sprengen, sowie einen expliziten Null-Typ mit _, der die bisherige Doppeldeutigkeit zwischen leerem Bulk String und Null auflöst.


# RESP2: HGETALL liefert ein flaches Array
*4
$4
name
$5
Alice
$3
age
$2
30

# RESP3: HGETALL liefert eine echte Map
%2
$4
name
$5
Alice
$3
age
$2
30

3. Push-Nachrichten: der entscheidende strukturelle Unterschied

Der vielleicht wichtigste strukturelle Unterschied ist der neue Push-Typ mit dem Präfix >. Push-Nachrichten sind Server-Nachrichten, die außerhalb des normalen Anfrage-Antwort-Zyklus über dieselbe Verbindung eintreffen können, ohne dass der Client zuvor eine passende Anfrage gestellt hat. Genau darauf baut das im Client-Side-Caching-Kontext genutzte Tracking-Protokoll auf: Invalidierungsnachrichten treffen als Push-Nachrichten ein, unabhängig davon, ob der Client gerade auf eine andere Antwort wartet.

Auch PubSub-Nachrichten lassen sich unter RESP3 als Push-Nachrichten statt als normale Array-Antworten übertragen, was Client-Bibliotheken erlaubt, Subscribe-Nachrichten und normale Befehlsantworten technisch sauber zu trennen, statt beide Typen anhand des Array-Inhalts unterscheiden zu müssen wie unter RESP2. RESP2 kennt diesen Mechanismus schlicht nicht, weshalb Funktionen wie Client-Side Caching mit Tracking zwingend RESP3 voraussetzen.

4. Protokollumschaltung über HELLO: wie ein Client RESP3 aktiviert

Eine Redis-Verbindung startet standardmäßig im RESP2-Modus, um mit älteren Clients kompatibel zu bleiben. Ein Client, der RESP3 nutzen möchte, sendet nach dem Verbindungsaufbau den Befehl HELLO 3, woraufhin der Server ab diesem Zeitpunkt für die gesamte weitere Verbindung im RESP3-Modus antwortet. Der HELLO-Befehl übernimmt dabei zusätzlich Aufgaben, die früher separat über AUTH und SELECT erledigt wurden, sodass sich Authentifizierung, Datenbankauswahl und Protokollumschaltung in einem einzigen Roundtrip erledigen lassen.

Wichtig ist, dass die Protokollumschaltung pro Verbindung gilt, nicht global für den Server: Zwei gleichzeitig geöffnete Verbindungen können unterschiedliche Protokollversionen nutzen, was einen schrittweisen Umstieg innerhalb einer Anwendung erlaubt, ohne dass sofort der gesamte Verbindungspool umgestellt werden müsste.


# Verbindung auf RESP3 umschalten, inklusive Authentifizierung
redis-cli
> HELLO 3 AUTH myuser mypassword
1# "server" => "redis"
2# "proto" => (integer) 3
3# "id" => (integer) 42
...

# Ohne HELLO bleibt eine Verbindung im RESP2-Modus

5. Client-Bibliotheken-Kompatibilität: worauf man in der Praxis achten muss

Nicht jede Redis-Client-Bibliothek unterstützt RESP3 gleich vollständig. Ausgereifte, aktiv gepflegte Bibliotheken für gängige Sprachen bieten meist eine explizite Konfigurationsoption, mit der sich RESP3 aktivieren lässt, während sie standardmäßig weiterhin im kompatibleren RESP2-Modus arbeiten, um bestehende Anwendungen nicht ungefragt zu verändern. Ältere oder weniger aktiv gepflegte Bibliotheken unterstützen mitunter nur RESP2 und liefern beim Versuch, HELLO 3 zu senden, entweder einen Protokollfehler oder ignorieren die neuen Typen stillschweigend.

Für PHP-Anwendungen mit gängigen Redis-Erweiterungen ist die Unterstützung inzwischen weit fortgeschritten, wichtig ist aber, vor einer Umstellung explizit zu prüfen, ob die konkret eingesetzte Version der Bibliothek RESP3-Antworttypen korrekt in die erwarteten PHP-Datentypen übersetzt, insbesondere bei Maps, die anders als flache Arrays gehandhabt werden müssen, und bei Doubles, die nun als PHP-Float statt als String ankommen.

6. Praktische Auswirkung auf eigenen Anwendungscode

Für Anwendungen, die eine moderne Client-Bibliothek mit vollständiger RESP3-Unterstützung nutzen, bleibt die Umstellung meist unsichtbar: Die Bibliothek übersetzt Maps, Sets und Doubles transparent in die jeweiligen nativen Datentypen der Programmiersprache, und der Anwendungscode, der etwa das Ergebnis von HGETALL als assoziatives Array behandelt, funktioniert unter RESP2 wie unter RESP3 identisch.

Auffällig wird der Unterschied vor allem bei Code, der auf konkrete Rückgabetypen prüft, etwa mit is_string() oder is_array() in PHP, oder bei Code, der Debug-Ausgaben oder Logging direkt auf Basis der rohen Protokollantwort erstellt. Wer ZSCORE-Ergebnisse bislang als String weiterverarbeitet hat, etwa durch String-Konkatenation, kann unter RESP3 auf einen Float statt eines Strings stoßen, was in schwach typisierten Sprachen selten zu Fehlern führt, in streng typisiertem Code aber explizite Anpassungen nötig machen kann.


{
  "zscore_result_resp2": "3.5",
  "zscore_result_resp3": 3.5,
  "hgetall_result_resp2": ["name", "Alice", "age", "30"],
  "hgetall_result_resp3": {"name": "Alice", "age": "30"}
}

7. Umstellung schrittweise angehen statt Big-Bang-Wechsel

Ein pauschaler, sofortiger Umstieg der gesamten Anwendung auf RESP3 ist selten nötig, da RESP2 auch langfristig unterstützt bleibt und beide Protokollversionen parallel auf demselben Redis-Server funktionieren. Sinnvoller ist es, RESP3 gezielt dort zu aktivieren, wo ein konkreter Vorteil entsteht, etwa bei Verbindungen, die Client-Side Caching mit Tracking nutzen sollen, während der Rest der Anwendung zunächst unverändert im RESP2-Modus verbleibt.

Vor einer breiteren Umstellung lohnt sich ein Testlauf gegen eine Staging-Umgebung mit realistischer Last, bei dem gezielt auf Stellen im Code geachtet wird, die Rückgabetypen prüfen oder rohe Protokollantworten verarbeiten. Automatisierte Tests, die typische Befehlsergebnisse wie HGETALL, ZSCORE und SMEMBERS gegen erwartete Datentypen prüfen, decken die meisten praktischen Stolperfallen zuverlässig auf.

8. Rückwärtskompatibilität: warum RESP2 nicht verschwindet

Redis-Server unterstützen RESP2 und RESP3 gleichzeitig und dauerhaft, es gibt keine Ankündigung, RESP2 in absehbarer Zeit abzuschaffen. Das ist bewusst so gewählt, weil ein riesiges Ökosystem an bestehenden Anwendungen, Bibliotheken und Tools auf RESP2 aufbaut, und ein erzwungener Wechsel enorme Kompatibilitätsprobleme verursachen würde. Neue Funktionen, die technisch auf RESP3 angewiesen sind, wie das Tracking-Protokoll für Client-Side Caching, funktionieren deshalb ausschließlich über RESP3-Verbindungen, während der übrige Funktionsumfang von Redis unter beiden Protokollversionen gleichermaßen nutzbar bleibt.

Für die Praxis bedeutet das: RESP3 ist keine Pflicht, sondern eine Option, die man dort aktiviert, wo sie einen konkreten funktionalen oder strukturellen Vorteil bringt. Wer keine der RESP3-exklusiven Funktionen benötigt, kann ohne Nachteile dauerhaft bei RESP2 bleiben.

9. Debugging und Diagnose: Protokollversion einer Verbindung erkennen

Bei der Fehlersuche in Verbindungsproblemen ist es hilfreich zu wissen, in welchem Protokollmodus eine bestehende Verbindung tatsächlich läuft. Der Befehl CLIENT INFO liefert unter anderem das Feld resp, das die aktive Protokollversion für die aufrufende Verbindung anzeigt, und CLIENT LIST liefert dieselbe Information für alle aktiven Verbindungen auf dem Server, was sich gut eignet, um zu prüfen, ob eine erwartete RESP3-Umstellung tatsächlich bei allen relevanten Verbindungen angekommen ist.

Bei unerwartetem Anwendungsverhalten nach einer teilweisen RESP3-Umstellung lohnt sich als erster Diagnoseschritt oft der Blick auf genau dieses Feld, da ein vergessener HELLO 3-Aufruf in einer bestimmten Verbindungspool-Konfiguration eine häufige, aber leicht zu übersehende Fehlerursache ist.


# Protokollversion der aktuellen Verbindung anzeigen
redis-cli -3 CLIENT INFO
# id=42 addr=... resp=3 ...

# Protokollversionen aller aktiven Verbindungen auflisten
redis-cli CLIENT LIST
Merkmal RESP2 RESP3 Praxisrelevanz
Map-Typ Als flaches Array kodiert Explizite Map mit Präfix % HGETALL liefert echte Zuordnung
Set-Typ Als Array kodiert Explizites Set mit Präfix ~ Semantik ungeordneter Mengen klarer
Double-Typ Als Bulk String kodiert Echter Gleitkommatyp mit Präfix , ZSCORE liefert direkt Float statt String
Push-Nachrichten Nicht vorhanden Eigener Typ mit Präfix > Voraussetzung für Tracking und PubSub-Trennung
Aktivierung Standard, keine Aktion nötig Explizit über HELLO 3 Pro Verbindung wählbar, kein globaler Zwang

Mironsoft

Cache-Layer-Setup und Magento-Redis-Integration

Magento-Cache, der nicht richtig greift oder falsch konfiguriert ist?

Wir richten Redis als Cache- und Session-Backend für Magento sauber ein, tunen Speicherverbrauch und Eviction-Strategien und sorgen dafür, dass Full Page Cache und Session-Storage zuverlässig zusammenspielen.

Redis-Setup

Cache-, Session- und FPC-Backend produktionsreif für Magento konfigurieren.

Memory-Tuning

Speicherverbrauch und Eviction-Policies auf die tatsächliche Shop-Last abstimmen.

High-Availability-Setup

Redis Sentinel oder Cluster für ausfallsichere Magento-Umgebungen einrichten.

10. Zusammenfassung

RESP3-Protokoll: Das Wichtigste auf einen Blick

Neue Datentypen

RESP3 führt explizite Maps, Sets, Doubles, Booleans, Big Numbers und einen eindeutigen Null-Typ ein, statt alles als Array oder String zu kodieren.

Push-Nachrichten

Der neue Push-Typ erlaubt Server-Nachrichten außerhalb des normalen Anfrage-Antwort-Zyklus und ist Voraussetzung für Tracking-basiertes Client-Side Caching.

Aktivierung

RESP3 wird pro Verbindung über HELLO 3 aktiviert, RESP2 bleibt Standard und wird dauerhaft parallel unterstützt.

Praxisauswirkung

Bei modernen Client-Bibliotheken meist unsichtbar, spürbar wird der Unterschied bei Typprüfungen und der Verarbeitung roher Protokollantworten.

11. FAQ: RESP3-Protokoll: Das Wichtigste auf einen Blick

1Was ist der grundlegende Unterschied zwischen RESP2 und RESP3?
RESP2 kodiert alle komplexeren Strukturen als flache Arrays oder Strings, während RESP3 explizite Typen für Maps, Sets, Doubles, Booleans und Push-Nachrichten einführt, die semantisch genauer abbilden, was ein Befehl zurückgibt.
2Wie aktiviert ein Client RESP3?
Über den Befehl HELLO 3 direkt nach dem Verbindungsaufbau, wobei HELLO zusätzlich Authentifizierung und Datenbankauswahl in einem Roundtrip übernehmen kann.
3Muss die gesamte Anwendung gleichzeitig auf RESP3 umgestellt werden?
Nein, die Protokollumschaltung gilt pro Verbindung, sodass unterschiedliche Verbindungen innerhalb derselben Anwendung unterschiedliche Protokollversionen nutzen können.
4Welche neue Funktion setzt RESP3 zwingend voraus?
Client-Side Caching mit dem Tracking-Protokoll benötigt die Push-Nachrichten von RESP3, da RESP2 keine Server-Nachrichten außerhalb des normalen Anfrage-Antwort-Zyklus kennt.
5Wird RESP2 in Zukunft abgeschafft?
Nein, es gibt keine Ankündigung, RESP2 abzuschaffen. Beide Protokollversionen werden dauerhaft parallel unterstützt, um das riesige bestehende Ökosystem nicht zu gefährden.
6Wie erkennt man, ob ZSCORE unter RESP3 anders zurückkommt als unter RESP2?
Unter RESP2 liefert ZSCORE einen Bulk String, der als Zahl geparst werden muss, unter RESP3 liefert es einen echten Double-Wert, der von der Client-Bibliothek direkt als Float übergeben wird.
7Unterstützen alle Redis-Client-Bibliotheken RESP3 gleich gut?
Nein, ausgereifte, aktiv gepflegte Bibliotheken bieten meist explizite RESP3-Unterstützung, ältere oder weniger gepflegte Bibliotheken können Protokollfehler liefern oder neue Typen ignorieren.
8Wie prüft man, in welchem Protokollmodus eine bestehende Verbindung läuft?
Mit CLIENT INFO oder CLIENT LIST, die im Feld resp die aktive Protokollversion für die jeweilige Verbindung anzeigen.
9Welche Codestellen sind bei einer Umstellung auf RESP3 am ehesten betroffen?
Code, der Rückgabetypen explizit prüft, etwa mit is_string() oder is_array(), sowie Code, der rohe Protokollantworten für Debugging oder Logging verarbeitet.
10Sollte man RESP3 sofort in der gesamten Anwendung aktivieren?
Nicht zwingend. Sinnvoller ist eine schrittweise Aktivierung dort, wo ein konkreter Vorteil entsteht, kombiniert mit gezielten Tests gegen typische Befehlsergebnisse vor einer breiteren Umstellung.