キャッシュとデータベースのデータの整合性

MySQLデータベースを作成し、その後、Redisのキャッシュを削除する最初のかどうか、またはキャッシュを削除、書き込みライブラリは、データの不整合が発生する可能性があります。例として:

1.あなたはキャッシュのRedisを削除した場合、書き込みデータベースのMySQLに読み込むための別のスレッドが時間がなかった、キャッシュが空で見つけ、その後、キャッシュに書き込まれたデータを読み取るためにデータベースに行き、その後、キャッシュが汚れています。

2.キャッシュを削除する前に、スレッドライブラリダウンライトのライブラリを書く場合は、データの不整合が発生することもあります、キャッシュを削除されません。

書き込みや読み出しが同時なので、順序を保証することはできません、データキャッシュとデータベースの問題に矛盾があるでしょう。

 

遅延時間は+二重欠失を期限切れ

書き込みキャッシュ操作が削除を実行される前と後のライブラリの動作中

、他のスレッドを読んで、データベースを取らないようにデータを読み出すために:1)キャッシュを削除します

2)書き込みデータベース

3)睡眠のnミリ秒:それは汚れていたので、他のスレッドがデータキャッシュで、その結果、スレッドにデータを書き込む前に、データベースの内容を読んでいる間、スレッドは、削除を防ぐために、後の第2の時間のために、他のスレッドからの書き込みでは、入って来ましたデータ。

4)再度、キャッシュを削除

睡眠へのミリ秒数を確認する方法

自分のプロジェクトのビジネスロジックを評価するためのデータ時間のかかる必要性をお読みください。そうすることの目的は、書き込み要求がダーティデータによって引き起こされるキャッシュされた読み取り要求を削除することができます読み取り要求の終了ことを確認することです。

もちろん、この戦略にも時間がかかり、Redisのデータベースのマスタ・スレーブ同期考慮されるべきです。睡眠時間の最後の書き込みデータ:ビジネス・ロジック上のデータを読むことに時間のかかる基盤、我々は数百ミリ秒を追加することができます。たとえば、次のようにスリープ1秒。

不正行為

このような最悪のシナリオが矛盾(不可避)であるが、時間がかかる書き込ま要求(遅延引き起こさ休眠を加え、現在の要求がないように、タイムアウト期間内に第二のスレッド削除データで開くことができることです追加の遅延)があります。

 

キャッシュ非同期更新

1.技術的な全体的なアイデア:

RedisのへのMySQL binlogの増分サブスクリプションのメッセージキューの消費量+ +増分データの更新

1)リードのRedis:Redisの中で実質的に熱的データ

2)書き込みのMySQL:MySQLのCRUD操作は、

3)更新Redisのデータ:MySQデータ操作ビンログ、Redisのを更新します

2.Redis更新

1)操作データは、2つのブロックに分割されます。

  • これは、合計金額(ライトワンスのRedisへのすべてのデータ)であります
  • 一つは、増分(ライブアップデート)であります

ここではMySQLへの更新、挿入、delate変更データを参照して、増分です。

2)メッセージ・キューを使用して、バイナリログ分析を読んだ後、各Redisのステーションのアップデートキャッシュデータをプッシュします。

例えばMySQLは新たな書き込み、更新、または削除操作を生成したら、それはRedisのバイナリログ関連するメッセージにプッシュすることができ、Redisのは、次にRedisの更新の記録をBINLOG。

MySQLのデータの整合性スタンバイバイナリログすることによって達成されるので、実際には、このメカニズムは、マスター・スレーブのMySQLバックアップ機構に非常に類似しています。

運河は、バックアップ要求スレーブmysqlデータベースの模倣である一方、データ更新のRedisは同じ効果に達したので、ここで運河(アリ、オープンソースのフレームワーク)を組み合わせることができ、あなたは、フレームを介してMySQLのバイナリログを購読することができます。

Redisのを達成するためにカフカ、RabbitMQのプッシュの更新など:もちろん、ここでのメッセージのプッシュツール、あなたは他のサードパーティ製を使用することができます。

おすすめ

転載: www.cnblogs.com/hf8051/p/11929247.html