web-dev-qa-db-ja.com

RedisデータをMySQLに同期するための最良の戦略は何ですか?

  1. ユースケースは、MySQLのローカルキャッシュとしてRedisを使用することです
  2. MySQLのデータ形式は、単一の主キーといくつかの他のフィールドです。 dbのクロステーブルクエリはありません
  3. RedisキーはMySQLの主キーであり、値はMySQLの他のフィールドを含むハッシュです
  4. 電源をオフにした場合、1分未満のデータ損失が許容されます。

私の解決策は:

  1. RedisはAOFファイルを書き込みます。一部のプロセスはこのファイルを監視し、更新されたデータをMySQLに同期します
  2. MySQL binlogのように、RedisをハックしてAOFを複数のファイルに書き込む
  3. データインターフェースは、Redisを通じてのみ読み取りと書き込みを行います。

このソリューションは大丈夫ですか?
そして、この仕事をするための最良の戦略は何ですか?

22
pengdu

何もハッキングする必要はありません;)

Mysqlのデータが必要な理由は完全にはわかりません。私が知っていれば、もっと適切な答えがあるかもしれません。いずれにせよ、一般的な答えとして、 redis keyspace notifications を使用できます。

キーに対してコマンドHSET、HMSET、HDEL、DELをサブスクライブできるため、キーが削除されるか、ハッシュ値が設定または削除されるたびに通知が届きます。

通知を見逃した場合、不整合が生じることに注意してください。したがって、たまにSCANコマンドを使用してすべてのキーを確認し、mysqlを更新する必要があるかどうかを確認することができます。

別の戦略は、2つの別々の構造を維持することです。 1つは値を含むハッシュで、もう1つは更新のタイムスタンプでソートされたすべての値のZSETです。両方の構造を最新に保つ最良の方法は、ハッシュとzsetをアトミックに操作する2つまたは3つのluaスクリプト(挿入/更新および削除)を記述することです。

次に、最後の同期操作よりもタイムスタンプが高い要素のZSETを定期的に照会し、更新されたすべてのキーを取得します(2番目のZSETを排他的に保持したくない場合を除き、削除されたキーが含まれます)。キーですべての要素を取得し、mysqlに同期します。

それがあなたのために働くことを願っています!

23
Javier Ramirez

redis replication プロトコルを実装できます。
しかし、あなたの要求のために githubプロジェクト があります。

安定版は2.5.0です

<dependency>
    <groupId>com.moilioncircle</groupId>
    <artifactId>redis-replicator</artifactId>
    <version>2.5.0</version>
</dependency>
3
Baoyi Chen

Redisの値を更新する場合、値をRedisのリストなどの他の「キュー」に配置できます。次に、キューの値を使用してMysqlを更新します。

Redisデータが多すぎない場合は、スケジューラを使用してすべてのデータをMysqlにバッチフラッシュするだけです。

0
songxin