2017-02-13 5 views
2

Ich baue einen Hintergrunddienst, der auf ein sehr kompliziertes Warteschlangensystem hinausläuft. Die Idee ist, Redis als nicht persistenten Speicher zu verwenden und ein Sub/Pub-Schema zu haben, das in einem Intervall läuft.Wie aktualisiere ich Daten in Redis und MySQL gleichzeitig?

Alle Abonnenten werden hinter einem Load Balancer stehen. Dadurch wird das komplizierte Problem der Statuserhaltung zwischen allen Servern hinter dem Load Balancer behoben.

Aber dies führt zu einem neuen Problem ... Wie kann ich sicherstellen, dass die nicht persistente (Redis) und persistente (MySQL) Datenbanken beide von meiner Anwendung (en) aktualisiert werden?

Es scheint, als wäre ich gezwungen, einen zu priorisieren, und wenn ich einen priorisieren muss, werde ich Persistenz priorisieren. Aber in diesem Szenario, was passiert, wenn MySQL aktualisiert wird, Redis nicht, und aus irgendeinem Grund habe ich die Verbindung zu MySQL verloren und kann meinen letzten Schreibvorgang nicht rückgängig machen?

Antwort

0

Es gibt zwei mögliche Lösungen für Ihr Problem:

  1. Nach diesen Schritten:
    a. Starten Sie die MySQL-Transaktion mit START TRANSACTION
    b. Führen Sie Ihre MySQL-Abfrage INSERT INTO ...
    c. Führen Sie Ihren Redis-Befehl aus
    d. Beenden Sie Ihre MySQL-Transaktion mit der COMMIT-Anweisung für den Fall, dass der Redis-Befehl erfolgreich ausgeführt wurde, oder ROLLBACK, falls der Befehl fehlgeschlagen ist
    Die Verwendung von Transformationen stellt sicher, dass Daten in beiden Speichern konsistent sind.
  2. Schreiben Sie LUA Skript für Redis mit LuaSQL Bibliothek (https://realtimelogic.com/ba/doc/en/lua/luasql.html), wo Sie eine Verbindung zu MySQL herstellen, Ihre Daten einfügen und dann Befehle an Redis auch senden. Dann kann der LUA-Skript von Client-Seite mit nur einem Befehl aufgerufen werden EVAL oder EVALSHA
Verwandte Themen