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.
Inhaltsverzeichnis
- 1. Was Redis Keyspace Notifications wirklich sind
- 2. notify-keyspace-events konfigurieren
- 3. Keyspace- und Keyevent-Kanaele im Detail
- 4. Auf expired-Events subscriben
- 5. Weitere Events: set, del, hset und mehr
- 6. Reaktive Architektur: ein Praxisbeispiel
- 7. Zuverlaessigkeit: warum Pub/Sub keine Garantien bietet
- 8. Alternativen: Redis Streams fuer garantierte Zustellung
- 9. Keyspace Notifications im Vergleich zu Polling und Streams
- 10. Zusammenfassung
- 11. FAQ
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.