ホームページ  >  記事  >  データベース  >  Redis が mysql との一貫性を維持する方法

Redis が mysql との一貫性を維持する方法

清浅
清浅オリジナル
2019-05-08 13:37:589993ブラウズ

redis と mysql の間の一貫性を維持するには、次の 2 つの方法があります: 1. データベースへの書き込みの前後に [redis.del(key)] 操作を実行し、適切なタイムアウトを設定します。 binlog へのサブスクライブに基づく同期メカニズムにより、redis と mysql の間の一貫性が実現されます。

Redis が mysql との一貫性を維持する方法

redis と mysql の間の一貫性を維持する方法は、遅延二重削除戦略を採用し、最初にキャッシュを削除してからデータベースに書き込むことです。2 番目の方法は、まず Redis を読み取り、次に mysql を書き込み、次に Redis データを更新します。

#キャッシュとデータベースの一貫性ソリューションは次のとおりです:

##方法 1: 遅延二重削除戦略を使用する

データベースへの書き込みの前後に redis.del(key) 操作を実行し、適切なタイムアウトを設定します。

疑似コードは次のとおりです

public void write(String key,Object data){ redis.delKey(key); db.updateData(data); Thread.sleep(500); redis.delKey(key); }

具体的な手順は次のとおりです:

(1) まずキャッシュを削除します

( 2) 次に、Database を書き込みます。

(3) 500 ミリ秒スリープします。

(4) 再度キャッシュを削除します。

では、この 500 ミリ秒はどのように決定され、どれくらいの長さである必要があるのでしょうか。寝ますか?

プロジェクトの時間のかかるデータ読み取りビジネス ロジックを評価する必要があります。この目的は、読み取りリクエストが確実に終了し、書き込みリクエストによって読み取りリクエストによって発生したキャッシュされたダーティ データを削除できるようにすることです。

もちろん、この戦略では、Redis とデータベースのマスター/スレーブ間の時間のかかる同期も考慮されています。データ書き込みの最終スリープ時間: データ ビジネス ロジックの読み取りにかかる時間に数百ミリ秒が追加されます。例: 1 秒間スリープします。

キャッシュの有効期限を設定する

理論的には、キャッシュの有効期限を設定することは、結果整合性を確保するための解決策です。すべての書き込み操作はデータベースの影響を受けます。キャッシュの有効期限に達している限り、後続の読み取りリクエストは自然にデータベースから新しい値を読み取り、キャッシュをバックフィルします。

このソリューションの欠点

二重削除ポリシーのキャッシュ タイムアウト設定と組み合わせると、最悪のシナリオでは、タイムアウト期間内にデータの一貫性がなくなり、追加の書き込みが発生します。リクエストの追加には時間がかかります。

方法 2: 非同期更新キャッシュ (binlog へのサブスクライブに基づく同期メカニズム)

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

MySQL binlog 増分サブスクリプション消費メッセージ キューの増分データは redis に更新されます

1) Redis の読み取り: ホット データは基本的にすべて Redis にあります

2) MySQL の書き込み: 追加、削除、変更はすべて MySQL の操作です

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

Redis update

(1) データ操作は主に 2 つに分かれますブロック:

1 つはフル (一度にすべてのデータを Redis に書き込む)、もう 1 つは増分 (リアルタイム更新) です。

ここで話しているのは増分であり、更新を指します。 、mysql変更データの挿入と削除。

(2) binlog を読み取った後、それを分析し、メッセージ キューを使用して各ステーションの Redis キャッシュ データをプッシュおよび更新します。

このようにして、MySQL で新しい書き込み、更新、削除、その他の操作が発生すると、バイナリログ関連のメッセージを Redis にプッシュでき、バイナリログ内のレコードに基づいて Redis が Redis を更新します。

実際、このメカニズムは MySQL のマスター/スレーブ バックアップ メカニズムと非常によく似ています。これは、MySQL のマスター/スレーブ バックアップも binlog を通じてデータの一貫性を実現するためです。

ここでは、MySQL の binlog をサブスクライブできる canal (Alibaba のオープンソース フレームワーク) を使用することができ、canal は mysql のスレーブ データベースのバックアップ リクエストを模倣して Redis データを更新し、同じ効果を達成します。

もちろん、ここでのメッセージ プッシュ ツールに他のサードパーティ (kafka、rabbitMQ など) を使用して、Redis へのプッシュ更新を実装することもできます。

以上がRedis が mysql との一貫性を維持する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。