In dieser Frage geht es um Best Practices in der Architektur.
Unsere aktuelle Architektur
Ich habe eine PHP-Klasse, die auf MySQL zugreift, um Benutzerinformationen zu erhalten. Nennen wir es User
. User
wird häufig zugegriffen, daher haben wir Caching-Ebenen implementiert, um die Last zu reduzieren.
Die erste Ebene wird als "Pro-Anfrage" -Cache bezeichnet. Nachdem die Daten von MySQL abgerufen wurden, speichern wir die Daten in einem privaten Eigentum von User
. Alle nachfolgenden Anforderungen für die Daten geben die Eigenschaft zurück, anstatt die Daten erneut von MySQL anzufordern.
Da die Webanforderung auf Anfragebasis lebt und stirbt, verhindert dieser Cache, dass die Anwendung in einer einzelnen Anfrage mehr als einmal auf MySQL zugreift.
Unsere zweite Schicht ist Memcached. Wenn das Privateigentum leer ist, überprüfen wir Memcached zuerst auf die Daten. Wenn Memcached leer ist, fragen wir MySQL nach den Daten ab, aktualisieren Memcached und aktualisieren die Privateigenschaft von User
.
Die Frage
Unsere Anwendung ist ein Spiel, und manchmal ist es unerlässlich, dass einige Daten so aktuell wie möglich sind. Innerhalb von etwa fünf Minuten kann eine Leseanforderung für die Benutzerdaten zehn- oder elfmal erfolgen. dann kann ein Update erfolgen. Nachfolgende Leseanforderungen müssen auf dem neuesten Stand sein, oder die Spielmechanik schlägt fehl.
Wir haben also einen Code implementiert, der ausgeführt wird, wenn eine Datenbankaktualisierung stattfindet. Dieser Code legt den Schlüssel in Memcached mit den aktualisierten Daten fest, sodass alle nachfolgenden Anforderungen an Memcached aktuell sind.
Ist das optimal? Gibt es Leistungsprobleme oder andere "Fallstricke", auf die wir achten sollten, wenn wir versuchen, eine Art "lebenden Cache" wie diesen zu verwalten?