Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Amazon ElastiCache (Valkey) für E-Commerce-Anwendungen
Eine E-Commerce-Anwendung profitiert von einer In-Memory-Cache-Schicht zwischen den Anwendungsservern und der Datenbank. Amazon, ElastiCache auf dem Valkey läuft, bietet eine Leselatenz von unter einer Millisekunde für Daten, auf die häufig zugegriffen wird — Produktkatalogeinträge, Inventarzählungen, Suchergebnisse und Benutzersitzungen —, wodurch die Datenbanklast reduziert und die Reaktionszeiten bei Datenverkehrsspitzen verbessert werden.
Cluster-Konfiguration
Wählen Sie einen Clustertyp, der auf Ihrem Datenvolumen, Ihren Durchsatzanforderungen und betrieblichen Präferenzen basiert.
| Cluster-Typ | Am besten geeignet für | Skalierung | Überlegungen |
|---|---|---|---|
Serverless |
Variable Verkehrsmuster, neue Anwendungen, Teams ohne Erfahrung im Cache-Betrieb |
Automatisch — skaliert Rechenleistung und Speicher je nach Bedarf |
Keine Kapazitätsplanung erforderlich. Variables Kostenmodell — Sie zahlen für das, was Sie verbrauchen. |
Node-based (Clustermodus aktiviert) |
Vorhersagbare Workloads mit hohem Durchsatz, Notwendigkeit einer detaillierten Kontrolle über Sharding und Knotentypen |
Manuelles oder automatisches Skalieren von Shards und Replikaten |
Erfordert Kapazitätsplanung. Festkostenmodell — Sie zahlen für die bereitgestellte Kapazität, unabhängig von der Auslastung. Unterstützt bis zu 500 Knoten pro Cluster. |
Für die meisten E-Commerce-Anwendungen, die noch am Anfang stehen, bietet Serverless den einfachsten Weg zur Produktion. Migrieren Sie zu knotenbasierten Clustern, wenn Sie über vorhersehbare Datenverkehrsbasislinien verfügen und mehr Kontrolle über die Clustertopologie, die Knotentypen und das Skalierungsverhalten benötigen.
| Einstellung | Wert | Begründung |
|---|---|---|
Engine |
Letzte stabile Version |
Verwenden Sie die neueste stabile Valkey-Version, die unter verfügbar ist. ElastiCache Vollständig kompatibel mit Redis OSS-Befehlen. Bietet Leistungsverbesserungen gegenüber früheren Versionen. |
Multi-AZ |
Aktiviert |
Automatisches Failover auf ein Replikat in einer anderen Availability Zone, wenn der primäre Knoten ausfällt. Erforderlich für E-Commerce-Workloads in der Produktion. |
In-transit Verschlüsselung |
Aktiviert (TLS) |
Verschlüsselt Daten zwischen Ihrer Anwendung und dem Cache-Cluster. Erforderlich für Workloads, die Benutzersitzungen oder personenbezogene Daten verarbeiten. |
At-rest Verschlüsselung |
Aktiviert |
Verschlüsselt Daten auf der Festplatte (Backups, Swap). Erforderlich für Compliance-Workloads. |
Subnetzgruppe |
Private isolierte Subnetze (mindestens 2 AZs) |
Kein Internetzugang. Nur von der Sicherheitsgruppe Ihrer Anwendung aus erreichbar. |
Wichtiges Design für Produktdaten
Entwerfen Sie Cache-Schlüssel so, dass sie vorhersehbar, debugbar und bereichsspezifisch sind, um Kollisionen zwischen Datentypen zu vermeiden.
| Datentyp | Wichtiges Muster | Werttyp | Beispiel |
|---|---|---|---|
Produktdetails |
|
Hash |
|
Anzahl des Inventars |
|
Zeichenfolge (Ganzzahl) |
|
Benutzersitzung |
|
Hash |
|
Suchergebnisse |
|
Zeichenfolge (JSON) |
|
Liste der Kategorien |
|
Auflisten |
|
Die wichtigsten bewährten Methoden für das Design:
Verwenden Sie Doppelpunkte als Trennzeichen, um die Lesbarkeit zu verbessern und die Werkzeuge zu unterstützen.
Halten Sie die Schlüssel kurz — lange Schlüssel verbrauchen Speicher und Netzwerkbandbreite.
Geben Sie das Datentyppräfix an, um Kollisionen zwischen Produkten, Sitzungen und anderen Entitäten zu vermeiden, die möglicherweise gemeinsame numerische IDs verwenden.
Verwenden Sie Hashes für Objekte mit mehreren Feldern (Produkte, Sitzungen), um partielle Lesevorgänge und Aktualisierungen zu ermöglichen, ohne den gesamten Wert abzurufen.
TTL-Strategie nach Datentyp
Legen Sie TTL-Werte (Time-to-Live) fest, die darauf basieren, wie häufig sich Daten ändern und wie veraltet sie sein können, ohne das Kundenerlebnis zu beeinträchtigen.
| Datentyp | TTL | Auslöser für die Invalidierung | Begründung |
|---|---|---|---|
Produktdetails |
5 Minuten |
Der Verkäufer bearbeitet das Produkt |
Produktbeschreibungen und Bilder ändern sich selten. Kurz genug, um Änderungen relativ schnell zu übernehmen, ohne dass bei jeder Änderung eine ausdrückliche Ungültigerklärung erfolgt. |
Anzahl der Inventare |
30 Sekunden |
Kaufen oder auffüllen |
Veralteter Lagerbestand kann zu Überverkäufen führen. Ein sehr kurzes TTL stellt sicher, dass die Anzahl häufig aktualisiert wird. Explizite Ungültigerklärung beim Kauf, um sofortige Richtigkeit zu gewährleisten. |
Suchergebnisse |
60 Sekunden |
Keine (TTL-based nur) |
Die Suchindizes werden regelmäßig aktualisiert. Caching reduziert die Belastung der Suchmaschinen. Neue Produkte erscheinen innerhalb von 60 Sekunden ohne ausdrückliche Ungültigerklärung. |
Benutzersitzung |
24 Stunden |
Abmelden oder Ablauf der Sitzung |
Die Sitzungen bleiben beim Surfen bestehen. Aktualisieren Sie TTL bei jedem Zugriff, um aktive Sitzungen aufrechtzuerhalten. Beim Abmelden explizit löschen. |
Liste der Kategorien |
2 Minuten |
Produkt added/removed aus der Kategorie |
Kategorieseiten sind stark frequentiert. Durch kurzes Caching werden Datenbankabfragen beim Surfen erheblich reduziert. |
Cache-aside Muster
Das Cache-Aside-Muster (auch Lazy Loading genannt) ist die gängigste Caching-Strategie für E-Commerce-Anwendungen. Ihre Anwendung überprüft zuerst den Cache und fragt die Datenbank nur ab, wenn der Cache fehlschlägt.
Pfad lesen (Pseudocode)
FUNCTION getProduct(productId): cacheKey = "product:" + productId // Step 1: Check the cache cachedValue = cache.GET(cacheKey) IF cachedValue exists: RETURN deserialize(cachedValue) // Cache hit — sub-millisecond // Step 2: Cache miss — query database product = database.query("SELECT * FROM products WHERE id = ?", productId) IF product not found: RETURN null // Step 3: Write to cache with TTL cache.SET(cacheKey, serialize(product), EXPIRE = 300) // 5 minutes RETURN product
Pfad schreiben (Pseudocode)
FUNCTION updateProduct(productId, updatedFields): // Step 1: Update the database (source of truth) database.update("UPDATE products SET ... WHERE id = ?", updatedFields, productId) // Step 2: Invalidate the cache (don't update it) cache.DELETE("product:" + productId) // Next read will trigger a cache miss and repopulate from database
Wichtig
Machen Sie den Cache bei Schreibvorgängen immer ungültig (löschen), anstatt ihn zu aktualisieren. Dadurch wird das Zeitfenster für Rennbedingungen reduziert, bei denen ein veralteter Lesevorgang einen neueren Wert überschreibt. Beim nächsten Lesevorgang wird der Cache aus der Datenbank, der Quelle der Wahrheit, wieder aufgefüllt. Beachten Sie, dass immer noch eine enge Race-Bedingung besteht: Wenn ein gleichzeitiger Lesevorgang Daten aus der Datenbank abruft, bevor der Schreibvorgang erfolgt, kann der Cache erneut mit veralteten Daten gefüllt werden, nachdem der Cacheschlüssel bereits gelöscht wurde. Für die meisten E-Commerce-Workloads ist dies aufgrund der kurzen TTL akzeptabel. Wenn Sie strikte Konsistenz benötigen, verwenden Sie eine verteilte Sperre oder versionierte Schreibvorgänge.
Behandlung von Cache-Ausfällen
FUNCTION getProductWithFallback(productId): TRY: RETURN getProduct(productId) // Normal cache-aside path CATCH cacheConnectionError: // Cache is unavailable — fall back to database directly RETURN database.query("SELECT * FROM products WHERE id = ?", productId) // Log the error, trigger an alarm, but don't fail the request
Entwerfen Sie Ihre Anwendung so, dass ein Cache-Ausfall die Leistung beeinträchtigt (langsamere Reaktionen), die Funktionalität jedoch nicht beeinträchtigt. Die Datenbank dient als Fallback.
Strategien zur Cache-Invalidierung
Durch die Invalidierung wird sichergestellt, dass Benutzer nach Aktualisierungen die aktuellen Daten sehen. Wählen Sie eine Strategie, die darauf basiert, wie schnell Änderungen sichtbar sein müssen.
| Ansatz | Funktionsweise | Wann sollte dies verwendet werden? |
|---|---|---|
Beim Schreiben löschen |
Die Anwendung löscht den Cacheschlüssel sofort nach der Aktualisierung der Datenbank. |
Die meisten Schreibvorgänge (Produktänderungen, Inventaränderungen). Einfach, zuverlässig, vermeidet veraltete Daten. |
Nur TTL-Ablauf |
Nicht ungültig machen — lassen Sie die TTL auf natürliche Weise ablaufen. |
Daten, bei denen eine kurze Veraltbarkeit akzeptabel ist (Suchergebnisse, Kategorienlisten, Analysen). |
Event-driven Ungültigerklärung |
Ein Hintergrundprozess überwacht Datenbankänderungsereignisse und macht die betroffenen Schlüssel ungültig. |
Systeme, bei denen sich der Schreibpfad und der Cache in unterschiedlichen Diensten befinden oder bei denen sich eine einzelne Datenbankänderung auf viele Cache-Schlüssel auswirkt. |
Bei Marketplace-Anwendungen, die Amazon ebenfalls CloudFront als CDN-Ebene verwenden, koordinieren Sie die Invalidierung auf beiden Ebenen: Löschen Sie den ElastiCache Schlüssel und senden Sie eine CloudFront Cache-Invalidierung (oder Cache-Tag-Invalidierung), damit Benutzer aktualisierte Inhalte sowohl auf der Anwendungs- als auch auf der Edge-Ebene sehen.
Verbindungsverwaltung
-
Verbindungspooling verwenden — Das Erstellen einer neuen TLS-Verbindung für jeden Cache-Vorgang erhöht die Latenz. Pflegen Sie einen Pool persistenter Verbindungen und verwenden Sie diese für mehrere Anfragen wieder.
-
Verbindungs-Timeouts einrichten — Verwenden Sie ein kurzes Verbindungs-Timeout (1—2 Sekunden) und ein kürzeres Befehls-Timeout (100—500 ms). Wenn der Cache nicht schnell reagiert, greifen Sie auf die Datenbank zurück, anstatt die Anfrage zu blockieren.
-
Gehen Sie ordnungsgemäß mit dem Failover um — Wenn ein Multi-AZ Failover auftritt, werden die Verbindungen zum alten Primärserver unterbrochen. Ihr Verbindungspool sollte unterbrochene Verbindungen erkennen und die Verbindung automatisch wiederherstellen. Die meisten Clientbibliotheken kümmern sich darum, überprüfen jedoch das zu testende Verhalten.
-
Konfigurationsendpunkt des Clusters verwenden — Wenn der Clustermodus aktiviert ist, stellen Sie eine Verbindung zum Konfigurationsendpunkt und nicht zu einzelnen Knotenendpunkten her. Der Konfigurationsendpunkt leitet Anfragen automatisch an den richtigen Shard weiter.
Wichtige zu überwachende Kennzahlen
| Metrik | Threshold | Zeitraum | Action |
|---|---|---|---|
CacheHitRate |
< 80% |
5 Minuten |
Untersuchen Sie — eine niedrige Trefferquote bedeutet, dass Ihre TTLs möglicherweise zu kurz sind, die Tasten schlecht entworfen sind oder dass der Arbeitssatz den Speicherplatz überschreitet. |
EngineCPUUtilization |
> 70% |
5 Minuten |
Hochskalieren (größere Knoten) oder verkleinern (mehr Shards). Ein hoher CPU-Wert bedeutet, dass der Cache mehr Befehle verarbeitet, als er effizient verarbeiten kann. |
DatabaseMemoryUsagePercentage |
> 80% |
5 Minuten |
Risiko von Räumungen. Erhöhen Sie den Arbeitsspeicher (nach oben skalieren) oder reduzieren Sie die Anzahl der gespeicherten Daten (kürzere TTLs, weniger zwischengespeicherte Datentypen). |
Evictions |
> 0 nachhaltig |
1 Minute |
Der Cache ist voll und Daten werden entfernt, um Platz zu schaffen. Erhöht die Anzahl der Cache-Fehler. Vergrößern Sie den Arbeitsspeicher oder reduzieren Sie die TTLs für weniger kritische Daten. |
CurrConnections |
> 80% der Größe Ihres Kundenpools |
5 Minuten |
Der Verbindungspool ist fast erschöpft. Erhöhen Sie die Poolgröße, reduzieren Sie die Verbindungsdauer oder untersuchen Sie Verbindungslecks im Anwendungscode. Basieren Sie den Schwellenwert auf der konfigurierten Poolgröße Ihrer Anwendung, nicht auf dem Servermaximum (65.000). |
Häufig gestellte Fragen
Wann sollte ich serverlos und wann knotenbasiert verwenden?
Verwenden Sie Serverless, wenn Ihr Traffic unvorhersehbar ist (neuer Marktplatz, saisonale Spitzen), wenn Sie eine Kapazitätsplanung vermeiden möchten oder wenn Ihr Team nicht über Fachwissen im Caching-Betrieb verfügt. Wechseln Sie zu knotenbasiertem Datenverkehr, wenn Ihre Datenverkehrsmuster stabil sind, Sie eine genaue Kontrolle über das Sharding benötigen oder Ihr anhaltender Durchsatz die knotenbasierte Nutzung kostengünstiger macht.
Sollte ich Valkey oder Redis OSS verwenden?
Verwenden Sie Valkey für neue Bereitstellungen. Valkey ist die Standard-Engine für neue ElastiCache Cluster, ist vollständig kompatibel mit Redis OSS-Befehlen und Datenstrukturen und wird kontinuierlich weiterentwickelt. Bestehende Redis OSS-Cluster funktionieren weiterhin — migrieren Sie zu Valkey, wenn es Ihnen passt, indem Sie das direkte Engine-Upgrade verwenden.
Was passiert, wenn der Cache nicht verfügbar ist?
Ihre Anwendung sollte den Cache als Optimierung und nicht als Abhängigkeit behandeln. Wenn der Cache nicht verfügbar ist, greifen Sie auf die direkte Abfrage der Datenbank zurück. Die Antwortzeiten werden länger sein, aber die Anwendung bleibt funktionsfähig. Multi-AZ Wenn diese Option aktiviert ist, ist der Cache selten vollständig nicht verfügbar — ein Failover auf ein Replikat dauert in der Regel weniger als 30 Sekunden.
Wie schätze ich den Speicherbedarf ein?
Berechnen Sie: (Anzahl der einzelnen Elemente, die zwischengespeichert werden sollen) × (durchschnittliche Größe pro Element) × (Overhead-Faktor 1,2 für Valkey-Datenstrukturen). Der Overhead variiert je nach Objektgröße und Datentyp — kleinere Objekte haben einen proportional höheren Overhead. Beispiel: 100.000 Produkte mit jeweils 2 KB und 1,2-fachem Overhead entsprechen etwa 240 MB. Fügen Sie Sitzungsdaten, Suchergebnisse und Inventarzahlen hinzu. Beginnen Sie mit dem Headroom (verwenden Sie 60% des verfügbaren Speichers als Ziel) und beobachten Sie die DatabaseMemoryUsagePercentage Kennzahl, um Anpassungen vorzunehmen.