Redis Keyspace Notifications nutzen, um auf Aenderungen zu reagieren
AI generated
SET
TTL
Redis · Keyspace Notifications · Pub/Sub · Events
Redis Keyspace Notifications nutzen
um auf Aenderungen zu reagieren, ohne zu pollen

Redis Keyspace Notifications verwandeln jede Schreiboperation und jeden Key-Ablauf in ein Pub/Sub-Event, auf das beliebig viele Consumer reagieren koennen. Statt teures Polling gegen den Datenbestand zu betreiben, abonniert eine Anwendung genau die Aenderungen, die sie interessieren, und baut so reaktive Architekturen ohne zusaetzliche Message-Queue.

13 Min. Lesezeit notify-keyspace-events · SUBSCRIBE · expired Redis 6.x · 7.x · redis-cli

1. Was Redis Keyspace Notifications wirklich sind

Redis Keyspace Notifications nutzen den bestehenden Pub/Sub-Mechanismus von Redis, um jede relevante Operation auf einem Key als Nachricht auf einem speziellen Kanal zu veroeffentlichen. Wird ein Key gesetzt, geloescht, geaendert oder laeuft er ab, kann Redis automatisch eine Nachricht an alle Clients senden, die den entsprechenden Kanal abonniert haben. Das ist der entscheidende Unterschied zu einer Anwendung, die den Datenbestand periodisch mit GET oder SCAN abfragt, um Aenderungen zu erkennen.

Der praktische Nutzen liegt darin, dass Redis Keyspace Notifications Polling vollstaendig ueberfluessig machen, fuer alle Anwendungsfaelle, bei denen ein System zeitnah auf Datenaenderungen reagieren soll. Statt alle paar Sekunden nachzufragen, ob sich etwas geaendert hat, meldet Redis die Aenderung aktiv, sobald sie auftritt. Das reduziert sowohl die Last auf Redis selbst als auch die Latenz zwischen Aenderung und Reaktion drastisch, oft von Sekunden auf Millisekunden.

Wichtig fuer das Verstaendnis: Keyspace Notifications sind standardmaessig deaktiviert, weil das Generieren und Veroeffentlichen jeder Aenderung als Event einen messbaren Overhead erzeugt. Erst durch explizite Konfiguration ueber notify-keyspace-events aktiviert ein Administrator diese Funktion gezielt fuer die Event-Typen, die tatsaechlich benoetigt werden.

2. notify-keyspace-events konfigurieren

Der Parameter notify-keyspace-events steuert, welche Event-Kategorien Redis veroeffentlicht, ueber eine kompakte Zeichenkette aus Flag-Buchstaben. K aktiviert Keyspace-Events, die nach dem Schema __keyspace@db__:key benannt sind, E aktiviert Keyevent-Events nach dem Schema __keyevent@db__:event. Ohne mindestens eines dieser beiden Flags werden gar keine Notifications generiert, unabhaengig davon, welche weiteren Event-Typen konfiguriert sind.

Die weiteren Flags selektieren konkrete Befehlskategorien: g fuer generische Befehle wie DEL und EXPIRE, s fuer Set-Befehle, h fuer Hash-Befehle, z fuer Sorted-Set-Befehle, x fuer Expired-Events, e fuer Evicted-Events durch Speicherdruck. Das Flag A ist eine Abkuerzung fuer alle Klassen ausser dem sehr verbose m-Flag fuer Key-Miss-Events. Fuer den haeufigsten Anwendungsfall, das Reagieren auf ablaufende Keys, reicht die Kombination Ex vollstaendig aus und erzeugt minimalen zusaetzlichen Overhead.


# Enable keyevent notifications for expired keys only (minimal overhead)
redis-cli> CONFIG SET notify-keyspace-events Ex

redis-cli> CONFIG GET notify-keyspace-events
1) "notify-keyspace-events"
2) "Ex"

# Enable both keyspace and keyevent notifications for all generic and string events
redis-cli> CONFIG SET notify-keyspace-events KEAg
redis-cli> CONFIG SET notify-keyspace-events KEA$

# Persist the setting in redis.conf for it to survive a restart
# notify-keyspace-events Ex

3. Keyspace- und Keyevent-Kanaele im Detail

Redis Keyspace Notifications veroeffentlichen jedes Event potenziell auf zwei verschiedenen Kanaelen gleichzeitig, abhaengig von den aktivierten K- und E-Flags. Der Keyspace-Kanal __keyspace@0__:mykey liefert als Nachricht den Namen des Events, etwa set oder expired, waehrend der Keyevent-Kanal __keyevent@0__:expired als Nachricht den Namen des betroffenen Keys liefert. Diese beiden Perspektiven ergaenzen sich: Der Keyspace-Kanal eignet sich, wenn ein Client an einem bestimmten Key interessiert ist und wissen will, was mit ihm passiert, der Keyevent-Kanal eignet sich, wenn ein Client an einem bestimmten Event-Typ interessiert ist, unabhaengig davon, welcher Key betroffen ist.

In der Praxis nutzt die grosse Mehrheit der Anwendungsfaelle ausschliesslich Keyevent-Kanaele, weil man in der Regel wissen will, welche Keys abgelaufen sind, nicht ob ein spezifischer, im Voraus bekannter Key abgelaufen ist. Das SUBSCRIBE auf __keyevent@0__:expired liefert genau diese Information, die Datenbanknummer im Kanalnamen erlaubt es, Notifications pro logischer Redis-Datenbank getrennt zu behandeln, was insbesondere in Multi-Tenant-Setups relevant ist.

4. Auf expired-Events subscriben

Der haeufigste Anwendungsfall fuer Redis Keyspace Notifications ist das Reagieren auf ablaufende Keys, weshalb dieser Abschnitt den kompletten Ablauf zeigt. Zunaechst wird notify-keyspace-events mit dem Flag Ex aktiviert, danach abonniert ein Client den Kanal __keyevent@0__:expired ueber PSUBSCRIBE mit Wildcard fuer die Datenbanknummer oder ueber SUBSCRIBE fuer eine spezifische Datenbank. Sobald ein beliebiger Key in dieser Datenbank ablaeuft, egal ob durch aktive oder passive Expiration, sendet Redis eine Nachricht mit dem Key-Namen an alle Subscriber.

Ein klassisches Praxisbeispiel: Ein Warenkorb wird als Redis-Key mit einer TTL von 30 Minuten gespeichert. Laeuft dieser Key ab, ohne dass eine Bestellung abgeschlossen wurde, kann ein Subscriber auf das expired-Event reagieren und automatisch eine Erinnerungs-E-Mail an den Kunden ausloesen. Ohne Keyspace Notifications muesste die Anwendung stattdessen regelmaessig alle Warenkorb-Keys durchsuchen und pruefen, welche kurz vor dem Ablauf stehen oder bereits abgelaufen sind, ein deutlich aufwendigerer und weniger praeziser Ansatz.


# Terminal 1: enable notifications and subscribe to expired events
redis-cli> CONFIG SET notify-keyspace-events Ex
OK
redis-cli> SUBSCRIBE __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "__keyevent@0__:expired"
3) (integer) 1

# Terminal 2: create a cart key with a short TTL
redis-cli> SET cart:user:4711 "..." EX 5
OK

# Back in Terminal 1, after ~5 seconds:
1) "message"
2) "__keyevent@0__:expired"
3) "cart:user:4711"

5. Weitere Events: set, del, hset und mehr

Neben expired unterstuetzen Redis Keyspace Notifications eine breite Palette weiterer Events, die praktisch jede relevante Schreiboperation abdecken. Das g-Flag aktiviert generische Events wie del, rename_from, rename_to und expire, das dollar-Zeichen-Flag aktiviert String-Events wie set, das h-Flag aktiviert Hash-Events wie hset und hdel, das l-Flag aktiviert List-Events wie lpush und rpop, das z-Flag aktiviert Sorted-Set-Events wie zadd. Jede dieser Kategorien kann unabhaengig voneinander aktiviert werden, um genau die Events zu erhalten, die eine Anwendung tatsaechlich verarbeiten muss.

Ein Beispiel fuer die Kombination mehrerer Event-Typen: Ein Cache-Invalidierungssystem moechte sowohl auf set- als auch auf del-Events reagieren, um abhaengige, abgeleitete Daten in einem zweiten System zu aktualisieren oder zu entfernen. Mit dem Flag KEA$g werden sowohl Keyspace- als auch Keyevent-Kanaele fuer String- und generische Events aktiviert, sodass ein einziger Subscriber-Prozess auf beide Aenderungsarten reagieren kann, ohne zwei separate Konfigurationen zu benoetigen.


# Enable string ($) and generic (g) events, both keyspace (K) and keyevent (E)
redis-cli> CONFIG SET notify-keyspace-events KEA$g

# Subscribe with a pattern to catch both set and del events
redis-cli> PSUBSCRIBE "__keyevent@0__:set" "__keyevent@0__:del"
Reading messages... (press Ctrl-C to quit)

# In another terminal:
redis-cli> SET product:catalog:1001 "..."
redis-cli> DEL product:catalog:1001

# Subscriber receives, in order:
1) "pmessage"
2) "__keyevent@0__:set"
3) "__keyevent@0__:set"
4) "product:catalog:1001"
1) "pmessage"
2) "__keyevent@0__:del"
3) "__keyevent@0__:del"
4) "product:catalog:1001"

6. Reaktive Architektur: ein Praxisbeispiel

Ein durchgaengiges Beispiel fuer eine reaktive Architektur mit Redis Keyspace Notifications ist ein Session-Timeout-System in einer E-Commerce-Anwendung. Jede aktive Nutzersitzung wird als Redis-Key mit einer TTL gespeichert, die bei jeder Nutzerinteraktion verlaengert wird. Laeuft die TTL ohne Verlaengerung ab, signalisiert das expired-Event, dass die Sitzung inaktiv geworden ist. Ein Subscriber-Prozess reagiert darauf, indem er den Warenkorb des Nutzers persistiert, falls noch nicht geschehen, Analytics-Events zur Sitzungsdauer sendet und eventuell reservierte, aber nicht gekaufte Lagerbestaende wieder freigibt.

Dieses Muster funktioniert ohne zusaetzliche Cron-Jobs oder Scheduler, die periodisch nach abgelaufenen Sitzungen suchen muessten. Die gesamte Reaktionslogik ist ereignisgetrieben und laeuft exakt dann, wenn das Ereignis tatsaechlich eintritt, nicht verzoegert bis zum naechsten Scan-Intervall. Fuer Systeme mit vielen kurzlebigen Zustandsuebergaengen, etwa Rate-Limiter-Reset, temporaere Sperren oder Feature-Flag-Ablauf, lassen sich mit demselben Muster zahlreiche weitere reaktive Workflows abbilden, ohne die Architektur um eine separate Message-Queue zu erweitern.

7. Zuverlaessigkeit: warum Pub/Sub keine Garantien bietet

Ein zentraler Fallstrick bei Redis Keyspace Notifications ist die zugrunde liegende Pub/Sub-Semantik: Redis Pub/Sub ist ein Fire-and-Forget-Mechanismus ohne Persistenz. Ist beim Eintreten eines Events kein Subscriber verbunden, geht die Nachricht unwiderruflich verloren, es gibt keine Warteschlange, aus der sie spaeter nachgeholt werden koennte. Ein Subscriber, der kurzzeitig die Verbindung verliert, etwa durch einen Netzwerkfehler oder einen Deployment-Neustart, verpasst alle Events, die waehrend dieser Zeit auftreten, ohne jede Fehlermeldung.

Diese Eigenschaft macht Redis Keyspace Notifications ungeeignet fuer Anwendungsfaelle, die eine garantierte Zustellung jedes einzelnen Events benoetigen, etwa Abrechnungs- oder Audit-Systeme. Fuer Anwendungsfaelle wie Cache-Invalidierung oder Session-Cleanup ist ein gelegentlich verlorenes Event meist unkritisch, weil ein nachfolgender Zugriff die Inkonsistenz ohnehin aufdeckt oder ein periodischer Fallback-Scan als Sicherheitsnetz dient. Wer echte Zustellgarantien braucht, sollte auf eine andere Redis-Datenstruktur zurueckgreifen.

8. Alternativen: Redis Streams fuer garantierte Zustellung

Redis Streams, eingefuehrt in Redis 5.0, bieten eine persistente, log-basierte Alternative zu Pub/Sub mit deutlich staerkeren Zustellgarantien. Waehrend Pub/Sub-Nachrichten sofort nach dem Versand verschwinden, bleiben Stream-Eintraege im Speicher erhalten, bis sie explizit entfernt werden, und Consumer koennen ueber Consumer-Groups mit XREADGROUP nachvollziehbar verfolgen, welche Eintraege bereits verarbeitet wurden. Ein Consumer, der voruebergehend offline war, kann beim Wiederverbinden alle waehrend der Ausfallzeit angesammelten Eintraege nachtraeglich abarbeiten, was bei Pub/Sub grundsaetzlich unmoeglich ist.

Fuer die Praxis bedeutet das: Redis Keyspace Notifications eignen sich hervorragend als Trigger-Mechanismus, der ein System ueber eine Aenderung informiert, waehrend die eigentliche, zuverlaessige Verarbeitung ueber einen Stream oder eine externe Message-Queue laufen sollte, sobald Zustellgarantien wichtig werden. Ein gaengiges Muster kombiniert beides: Ein leichter Subscriber empfaengt das expired-Event und schreibt es unmittelbar in einen Redis-Stream, wo es mit vollen Zustellgarantien weiterverarbeitet wird.

9. Keyspace Notifications im Vergleich zu Polling und Streams

Die Wahl zwischen Polling, Keyspace Notifications und Streams haengt vom Anforderungsprofil an Latenz, Last und Zustellgarantie ab. Die folgende Tabelle stellt die zentralen Eigenschaften gegenueber.

Eigenschaft Polling Keyspace Notifications Redis Streams
Latenz bis zur Reaktion Abhaengig vom Poll-Intervall Nahezu sofort Nahezu sofort
Zustellgarantie Ja, da Zustand direkt gelesen wird Keine, Fire-and-Forget Ja, mit Consumer-Groups
Last auf Redis Hoch bei kurzen Intervallen Gering, ereignisgetrieben Gering bis moderat
Implementierungsaufwand Gering Gering Mittel
Empfehlung Nur bei niedriger Kritikalitaet Trigger fuer unkritische Reaktionen Kritische, zustellgarantierte Workflows

Fuer die meisten reaktiven Anwendungsfaelle im Caching- und Session-Umfeld sind Redis Keyspace Notifications der richtige Kompromiss aus Einfachheit und Reaktionsgeschwindigkeit. Sobald jedoch jedes einzelne Event zuverlaessig verarbeitet werden muss, etwa bei Abrechnung oder Audit-Trails, fuehrt der Weg ueber Redis Streams oder eine dedizierte Message-Queue.

10. Zusammenfassung

Redis Keyspace Notifications machen aus jeder relevanten Schreiboperation und jedem Key-Ablauf ein Pub/Sub-Event, auf das Anwendungen ohne Polling reagieren koennen. Die Aktivierung erfolgt ueber notify-keyspace-events mit einer Kombination aus K- und E-Flags fuer Kanaltypen sowie weiteren Flags fuer konkrete Event-Kategorien wie expired, set oder del. Subscriber abonnieren typischerweise Keyevent-Kanaele wie __keyevent@0__:expired, um gezielt auf einen bestimmten Event-Typ zu reagieren.

Der entscheidende Vorbehalt: Redis Pub/Sub bietet keine Zustellgarantien, verlorene Verbindungen fuehren zu verlorenen Events, ohne dass eine Wiederherstellung moeglich ist. Fuer unkritische, reaktive Workflows wie Cache-Invalidierung oder Session-Cleanup ist das meist akzeptabel, fuer Anwendungsfaelle mit harten Zustellanforderungen sollte stattdessen Redis Streams mit Consumer-Groups zum Einsatz kommen. Richtig eingesetzt, ersetzen Keyspace Notifications teures Polling durch echte Event-Driven-Architektur, ohne eine zusaetzliche Message-Queue in die Infrastruktur einzufuehren.

Redis Keyspace Notifications, das Wichtigste auf einen Blick

Aktivierung

notify-keyspace-events mit K und E fuer Kanaltypen, plus Flags wie x fuer expired oder g fuer generische Events.

Zwei Kanaltypen

Keyspace-Kanal liefert den Event-Namen pro Key, Keyevent-Kanal liefert den Key-Namen pro Event-Typ.

Keine Zustellgarantie

Pub/Sub ist Fire-and-Forget, offline Subscriber verpassen Events unwiderruflich, keine Nachholmoeglichkeit.

Alternative bei Bedarf

Fuer garantierte Zustellung Redis Streams mit Consumer-Groups statt reinem Pub/Sub verwenden.

11. FAQ: Redis Keyspace Notifications nutzen

1Standardmaessig aktiv?
Nein, muss explizit ueber notify-keyspace-events aktiviert werden.
2Was bedeuten K und E?
K Keyspace-Kanaele, E Keyevent-Kanaele, mindestens eins noetig.
3Wie subscribe ich auf expired?
Ex aktivieren, dann SUBSCRIBE __keyevent@0__:expired.
4Keyspace vs. Keyevent Kanal?
Keyspace liefert Event-Name pro Key, Keyevent liefert Key-Name pro Event.
5Zuverlaessig zustellbar?
Nein, Fire-and-Forget, offline Subscriber verpassen Events dauerhaft.
6Welche Event-Typen gibt es?
del, set, hset, lpush, zadd und viele weitere ueber eigene Flags.
7Alternative fuer Garantien?
Redis Streams mit Consumer-Groups fuer garantierte Zustellung.
8Spuerbarer Overhead?
Minimal bei gezielter Aktivierung, hoeher bei allen Event-Klassen und hoher Schreibrate.
9Fuer Cache-Invalidierung nutzbar?
Ja, gaengiges Muster ueber set- und del-Events.
10Funktioniert es in Redis Cluster?
Ja, aber jeder Knoten veroeffentlicht nur eigene Keys, Subscriber muss alle Knoten verbinden.