it-swarm.com.de

Was ist die beste Strategie, um Redis-Daten mit MySQL zu synchronisieren?

  1. Der Anwendungsfall besteht darin, Redis als lokalen Cache von MySQL zu verwenden
  2. Das Datenformat in MySQL ist: ein einzelner Primärschlüssel und mehrere andere Felder. Es wird keine tabellenübergreifende Abfrage von db geben
  3. Der Redis-Schlüssel ist der Primärschlüssel in MySQL, und der Wert ist ein Hash, der andere Felder in MySQL enthält
  4. Beim Ausschalten sind Datenverluste von weniger als einer Minute akzeptabel.

Meine Lösung lautet:

  1. Redis schreibt eine AOF-Datei. Einige Prozesse überwachen diese Datei und synchronisieren die aktualisierten Daten mit MySQL
  2. Hack Redis, um AOF in mehreren Dateien zu schreiben, genau wie MySQL binlog
  3. Die Datenschnittstelle liest und schreibt nur über Redis

Ist diese Lösung in Ordnung?
Und was ist die beste Strategie, um diesen Job zu erledigen?

18
pengdu

Du musst nichts hacken;)

Ich bin nicht ganz sicher, warum Sie die Daten auf MySQL benötigen. Wenn ich es wüsste, würde es vielleicht eine passendere Antwort geben. In jedem Fall können Sie als generische Antwort redis Keyspace-Benachrichtigungen verwenden

Sie können die Befehle HSET, HMSET, HDEL und DEL auf Ihren Schlüsseln abonnieren, sodass Sie jedes Mal eine Benachrichtigung erhalten, wenn ein Schlüssel gelöscht oder ein Hashwert gesetzt oder entfernt wird.

Beachten Sie, dass Sie eine Inkonsistenz haben, wenn Sie eine Benachrichtigung verpassen. Von Zeit zu Zeit könnten Sie einfach den Befehl SCAN verwenden, um alle Ihre Schlüssel durchzusehen und in mysql nachzuschauen, ob sie aktualisiert werden müssen.

Eine andere Strategie könnte die Aufrechterhaltung zweier getrennter Strukturen sein. Einer wäre der Hash mit den Werten und der andere wäre ein ZSET aller Werte, sortiert nach dem Zeitstempel der Aktualisierung. Um beide Strukturen auf dem neuesten Stand zu halten, können Sie am besten zwei oder drei Lua-Skripts schreiben (Einfügen/Aktualisieren und Löschen), die den Hash und das Zset atomar bearbeiten.

Dann können Sie das ZSET nur in regelmäßigen Abständen nach den Elementen mit einem Zeitstempel abfragen, der höher als Ihre letzte Synchronisierungsoperation ist, und Sie erhalten alle aktualisierten Schlüssel (dies würde gelöschte Schlüssel enthalten, es sei denn, Sie möchten einen zweiten ZSET ausschließlich für diese beibehalten) und dann einfach Rufen Sie alle Elemente per Schlüssel ab und synchronisieren Sie sie mit mysql.

Ich hoffe, es wird für Sie funktionieren!

18
Javier Ramirez

sie können das Protokoll redis replication implementieren.
aber es gibt ein github-Projekt für Ihre Anforderungen. 

die stabile Version ist 2.5.0 

<dependency>
    <groupId>com.moilioncircle</groupId>
    <artifactId>redis-replicator</artifactId>
    <version>2.5.0</version>
</dependency>
1
leon chen

Wenn Sie Werte in Redis aktualisieren, können Sie die Werte in andere "Warteschlangen" einfügen, z. B. "Liste in Redis". Anschließend werden die Werte in die Warteschlange aufgenommen und MySQL aktualisiert.

Wenn die Redis-Daten nicht zu groß sind, verwenden Sie einfach einen Scheduler, um alle Daten stapelweise in Mysql zu leeren.

0
songxin