Redis の高頻度面接の質問のまとめ (パート 2)

目次

1. RedisのBig Key(ビッグキー)とは

2. Big Key はどのような問題を引き起こしますか?

3. bigkey を見つける方法は?

4. Redis 運用環境でkeys * コマンドを慎重に使用する必要がある理由

5. 多数のキーの集中的な有効期限切れに対処する方法

6. バッチ操作を使用してネットワーク転送を削減する

7. キャッシュの侵入

8. キャッシュの内訳

9. キャッシュ雪崩

10. キャッシュ汚染 (またはフル)

11. Redis は合計 8 つの排除戦略をサポートします

12. データベースとキャッシュの一貫性


1. RedisのBig Key(ビッグキー)とは

Redis のビッグ キーは、多くのメモリを消費するキーと値のペアを指します。Redis では、メモリは貴重なリソースです。一部のキーと値のペアがメモリを占有しすぎると、Redis サーバーのパフォーマンスが低下し、メモリ オーバーフローが発生する可能性もあります。

具体的には、Redis のビッグ キーは通常、特定のしきい値 (たとえば、10KB) を超えるキーと値のペアを指します。これらのキーと値のペアには、大量のテキストまたはバイナリ データが含まれる場合や、多数のハッシュ フィールドやコレクション要素などが含まれる場合があります。これらのビッグ キーについては、メモリ使用量を削減し、Redis サーバーのパフォーマンスと信頼性を向上させるために、特別な処理と最適化が必要です。

Redis Big Key が登場した理由としては、大量のテキストやバイナリ データが保存されているか、大量のハッシュ フィールドやコレクション要素が保存されていることが考えられます。

2. Big Key はどのような問題を引き起こしますか?

Big Key (ビッグ キー) は、Redis で大量のメモリを占有するキーと値のペアです。Big Key が多すぎると、次のような危険を含め、Redis サーバーのパフォーマンスと信頼性に悪影響を及ぼします。 :

  1. メモリ占有: Big Key は大量のメモリを占有するため、Redis サーバーのメモリが不足すると、Redis サーバーのパフォーマンスが低下し、場合によっては Redis サーバーがクラッシュする可能性があります。

  2. 動作遅延: Big Key の読み書き時に CPU リソースと IO リソースが多く占有されるため、動作遅延が増加します。複数のクライアントが同時に Big Key を操作している場合、待機時間が長くなり、Redis サーバーのパフォーマンスの低下につながります。

  3. 永続化の遅延: RDB ファイルや AOF ファイルへの書き込みなど、ビッグ キーを永続化する必要がある場合、大量の CPU リソースと IO リソースが占有され、永続化の遅延が増加します。Redis サーバーの負荷が高すぎると、永続化の失敗や待ち時間の増加が発生し、データの信頼性と一貫性に影響を与える可能性があります。

  4. データ損失: Redis サーバーのメモリが不十分な場合、メモリ オーバーフローが発生し、ビッグ キー データが失われる可能性があります。Big Key に重要なデータが含まれている場合、データの損失やデータの不整合が発生する可能性があります。

要約すると、Big Key の存在は Redis サーバーのパフォーマンスと信頼性に悪影響を及ぼし、メモリ使用量、操作の遅延、永続化の遅延、データ損失などの問題を引き起こす可能性があります。したがって、メモリ使用量を削減し、Redis サーバーのパフォーマンスと信頼性を向上させるには、Big Key の特別な処理と最適化が必要です。

3. bigkey を見つける方法は?

1. Redis に付属の--bigkeysパラメーターを使用してビッグ キーをすばやく見つけます。具体的な手順は次のとおりです。

  1. Redis クライアントを起動するときに、--bigkeys次のようなパラメーターを追加します。
    redis-cli --bigkeys
    
  2. Redis クライアントが Redis サーバーに接続した後、次のようなコマンドを実行します。
    bigkeys
  3. Redis サーバーはすべてのキー値をスキャンし、大量のメモリを占有しているキー値を見つけて、その情報を返します。次に例を示します。
    bigkeys
    # Scanning the entire keyspace to find biggest keys as well as
    # average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
    # per 100 SCAN commands (not usually needed).
    [00.00%] Biggest string found so far 'my_big_string' with 100 bytes
    [00.00%] Biggest list found so far 'my_big_list' with 10 elements
    [00.00%] Biggest set found so far 'my_big_set' with 5 members
    [99.99%] Biggest zset found so far 'my_big_zset' with 1000 members
    [99.99%] Biggest hash found so far 'my_big_hash' with 10 fields
    -------- summary --------
    Sampled 10000 keys in the keyspace!
    Total key length in bytes is 51451 (avg len 5.15)
    Biggest string found 'my_big_string' has 100 bytes
    Biggest list found 'my_big_list' has 10 items
    Biggest set found 'my_big_set' has 5 members
    Biggest zset found 'my_big_zset' has 1000 members
    Biggest hash found 'my_big_hash' has 10 fields

    上記の方法により、すべてのビッグキーを迅速に見つけ出し、そのサイズとタイプを理解して、さらなる最適化と処理を実行できます。--bigkeysパラメータを使用すると Redis データベース全体がスキャンされ、Redis サーバーのパフォーマンスに一定の影響を与える可能性があるため、適切なタイミングで使用する必要があることに注意してください

2. Redis コマンドを使用します (本番環境では注意して使用してください) : Redis には、すべてのキーの情報とサイズを表示するためのいくつかのコマンドが用意されています。たとえば、KEYSコマンドはすべてのキー名をリストでき、TYPEコマンドはキー値のタイプを表示でき、STRLENコマンドは文字列キー値の表示 コマンドの長さにより、LLENリストのキー値の長さなどを表示できます。これらのコマンドは、ビッグ キーを検出するために使用できます。たとえば、文字列キー値の長さがしきい値を超えている、リスト キー値の長さがしきい値を超えているなどです。

3. Redis ツールを使用する: Redis は、ビッグ キーの検出に役立ついくつかのツールを提供します。たとえば、redis-rdb-toolsこのツールは RDB ファイルを解析し、すべてのキー値の情報とサイズを一覧表示し、redis-cliツールは Redis サーバーに接続し、いくつかのコマンドを実行できます。 、すべてのキーの値の情報やサイズなどの表示など。これらのツールを使用すると、Big Key をより簡単に発見できます。

4. サードパーティ ツールを使用する: Redis の組み込みツールに加えて、ビッグ キーの検出に役立つサードパーティ ツールがいくつかあります。たとえば、Redis によって公式に推奨されているツールは、Redis データベースをスキャンし、すべてのキーを検索できますbigkeys。 Big Key を選択し、サイズごとに並べ替えます。

4. Redis 運用環境でkeys * コマンドを慎重に使用する必要がある理由

Redisでは、keysコマンドはキー名のパターンマッチングコマンドであり、指定したパターンに従って一致するキー名を検索することができ、高速なデータ検索を実現します。実際の開発では、コマンドを使用してすべてのキー名をクエリする必要がある場合がありますkeysただし、Redis 運用環境では、keys *次の理由からコマンドを慎重に使用する必要があります。

  1. パフォーマンスの問題:keys *このコマンドは Redis データベース全体を走査し、すべてのキー名をメモリにロードします。これにより、システム リソースが大量に消費され、Redis サーバーのパフォーマンスが低下し、場合によっては Redis サーバーがダウンする可能性があります。

  2. ブロックの問題: Redis がkeys *コマンドを実行すると、keys *コマンドの実行が完了するまで他のすべてのクライアントのコマンド リクエストがブロックされます。これにより、他のクライアントのリクエストがブロックされ、システムの応答速度と安定性に影響を与える可能性があります。

特定のプレフィックスのキー名をクエリする必要がある場合は、Redis コマンドを使用できます。このSCANコマンドを使用すると、データベース内のキー名をバッチで反復処理できるため、すべてのキー名を一度にロードすることがなくなり、パフォーマンスと安定性が向上します。たとえば、次のコマンドを使用して、接頭辞 が付いているuser:すべての。

SCAN 0 MATCH user:*

このコマンドはカーソルと一致するキーのバッチを返し、カーソルの値に応じて一致するキーの次のバッチを取得できます。SCANコマンドを使用してキー名をクエリする場合、一部のキー名が重複したり欠落したりする可能性があるため、特定の処理および重複排除操作が必要になることに注意してください

コマンドを使用するだけでなくSCAN、Redis データ構造にインデックスを設定したり、適切なコマンドを使用してデータをクエリしたりして、取得の効率と精度を向上させることもできます。たとえば、Redis のハッシュ データ構造を使用する場合、HGETALLすべてのキー名をクエリする代わりに、コマンドを使用してすべてのフィールドと値をクエリできます。

5. 多数のキーの集中的な有効期限切れに対処する方法

Redis では、キーの有効期限が切れると、Redis はそのキーをデータベースから自動的に削除します。Redis データベースに多数のキーがあり、これらのキーの有効期限が類似している場合、これらのキーの有効期限が切れると、次のような問題が発生する可能性があります。

  1. メモリ使用量の問題: 多数のキーの有効期限が切れると、これらのキーによって占有されていたメモリが時間内に解放されない可能性があり、その結果、Redis サーバーがメモリ不足になってクラッシュするまで、Redis サーバーのメモリ使用量が増加し続けます。

  2. パフォーマンスの問題: 多数のキーが期限切れになると、Redis サーバーはこれらの期限切れのキーの削除を処理するために多くの CPU 時間を費やす必要があり、これにより Redis サーバーのパフォーマンスが低下し、応答速度や応答速度に影響を与える可能性があります。 Redisサーバーの安定性。

これらの問題を回避するには、次のような期限切れのキーセットの影響を軽減するためのいくつかの措置を講じることができます。

  1. キーの有効期限を合理的に設定する: Redis を使用する場合、多数のキーが一元的に有効期限切れになることを避けるために、ビジネス要件やシステム リソースの条件に応じてキーの有効期限を合理的に設定する必要があります。有効期限は、データ アクセス パターンやビジネス ニーズなどの要因に応じて調整できます。

  2. 有効期限の分散: キーの有効期限をランダムに分散することで、期限切れのキーの集中によって引き起こされる問題を回避できます。キーの有効期限を設定する場合、有効期限がまったく同じにならないように、特定のランダムな要素を追加できます。

  3. Redis のレイジーフリー機能を使用すると、Redis はキーによって使用されるメモリの解放を非同期的に遅らせることができるため、メインスレッドのブロックが回避され、Redis サーバーのパフォーマンスと安定性が向上します。

6. バッチ操作を使用してネットワーク転送を削減する

Redis はバッチ操作コマンドをサポートしており、複数のコマンド要求を Redis サーバーに一度に送信することで、ネットワーク送信の回数が削減され、Redis サーバーのパフォーマンスと効率が向上します。一般的なバッチ操作コマンドは次のとおりです。

  1. MGET および MSET コマンド: MGET コマンドは一度に複数のキーの値を取得でき、MSET コマンドは一度に複数のキーの値を設定できます。たとえば、次のコマンドはキー a、b、c の値を一度に取得できます。
    MGET a b c
    
  2. DEL コマンド: DEL コマンドは、複数のキーを一度に削除できます。たとえば、次のコマンドはキー a、b、c を一度に削除します。
    DEL a b c
    
  3. PIPES コマンド: PIPELINE コマンドは、複数のコマンドをパッケージ化して Redis サーバーに送信することで、ネットワーク送信の数を減らし、複数のコマンドの戻り結果を一度に取得することで Redis サーバーのパフォーマンスを向上させることができます。たとえば、次のコマンドは複数のコマンドを同時に実行できます。
    REDISCLI> PIPELINE
    REDISCLI> SET a 1
    REDISCLI> INCR b
    REDISCLI> GET c
    REDISCLI> EXEC
    

    なお、バッチ運用コマンドを使用する場合、最高のパフォーマンスと安定性を実現するには、コマンドパラメータを合理的に設定し、実際の状況に応じてRedisサーバーの構成とパラメータを調整する必要があります。

7. キャッシュの侵入

キャッシュ侵入とは、存在しないデータに対するクエリを指します。キャッシュ内にデータがないため、クエリ リクエストはキャッシュをバイパスしてデータベースに直接クエリを実行し、データベースに過剰な負荷がかかります。キャッシュ侵入の問題は、悪意のある攻撃、キャッシュされたデータの不当な有効期限、ビジネス データの不均等な分散などの要因によって発生します。

悪意のある攻撃はキャッシュ侵入の一般的な形式であり、攻撃者はデータベース リソースを消費するために、存在しないクエリ リクエストを意図的に送信します。たとえば、攻撃者はクエリ パラメータに特殊文字を追加したり、悪意のあるリクエストを作成したりすることで、キャッシュをバイパスしてデータベースにクエリを実行できます。

キャッシュ データの有効期限が不当であることも、キャッシュ侵入の一般的な原因です。キャッシュ内のデータの有効期限が短すぎるか、まったく設定されていない場合、クエリ リクエストはキャッシュをバイパスし、データの有効期限が切れた後にデータベースをクエリします。

ビジネス データの不均一な分散は、キャッシュの侵入の問題を引き起こす可能性もあります。たとえば、一部のホット データが非常に頻繁にアクセスされ、他のデータがあまりアクセスされない場合、ホット データの一部のみがキャッシュに格納され、他のデータはキャッシュされない可能性があります。クエリ リクエストがキャッシュにないデータにアクセスすると、データベースへのクエリのためにキャッシュがバイパスされ、データベースに過剰な負荷がかかります。

キャッシュの侵入の問題を解決するには、次のような対策を講じることができます。

  1. ブルーム フィルター: ブルーム フィルターはクエリ リクエストをフィルタリングするために使用され、クエリ リクエストが正当なものかどうかを効果的に識別できます。ブルーム フィルターは、要素がセット内にあるかどうかを迅速に判断できるハッシュ ベースのデータ構造であり、高効率、高速、低ストレージという特徴があります。

  2. 空のオブジェクトをキャッシュ: 空のオブジェクトをキャッシュにキャッシュします。クエリ リクエストが存在しないデータにアクセスする場合、クエリ リクエストがキャッシュをバイパスしてデータベースに直接アクセスすることを避けるために、キャッシュ内の空のオブジェクトを返します。

  3. 適切なキャッシュ有効期限を設定する: 適切なキャッシュ有効期限を設定すると、キャッシュの侵入の問題を軽減できます。一般に、キャッシュに保存されるデータがすべてホット データであることを保証するために、キャッシュの有効期限はビジネス データのアクセス頻度と一致する必要があります。

  4. 悪意のあるリクエストの制限: アクセス頻度とクエリ リクエストのクエリ パラメータを制限すると、悪意のある攻撃やキャッシュ侵入の問題を効果的に防ぐことができます。

8. キャッシュの内訳

キャッシュの故障とは、同時アクセスが多い状態で、特定のホット データのキャッシュが期限切れになった後、大量のリクエストがデータベースに殺到し、データベースへの負荷が急激に上昇し、データベースの安定性とパフォーマンスに深刻な影響を与えるという事実を指します。システム。キャッシュの故障は通常、ホット データのアクセス頻度が非常に高いため、キャッシュ内のデータの有効期限が短くなり、多数のクエリ リクエストが発生し、同時にキャッシュ内のデータが無効になることが原因です。そのため、多数のリクエストがキャッシュをバイパスし、データベースに直接クエリを実行する原因となります。

キャッシュの故障に対する解決策には通常、次のようなものがあります。

  1. ロック: キャッシュが無効になると、分散ロックを使用してリクエストをシリアル化し、1 つのリクエストのみがデータベースにアクセスできるようにし、他のリクエストは結果が返されるのを待ちます。

  2. 電流制限: ホットスポット データのアクセス頻度が非常に高い場合、電流制限を使用して同時リクエストの数を制御し、瞬時に大量のリクエストが流入するのを回避できます。

  3. データの予熱: ホット データをキャッシュに事前ロードし、キャッシュに障害が発生したときにキャッシュからデータを迅速に取得します。これにより、多数のリクエストがキャッシュをバイパスしてデータベースに直接クエリすることを回避します。

  4. 遅延キャッシュ読み込み: キャッシュに障害が発生した場合、データベース内のデータをすぐにクエリするのではなく、一定期間待機してからクエリを実行します。その期間中に同じクエリ リクエストがあった場合、キャッシュ内のデータが直接返されます。

  5. セカンダリ キャッシュを使用する: データを同時にマルチレベル キャッシュに保存します。たとえば、ホット データをメモリ キャッシュと分散キャッシュに保存します。メモリ キャッシュに障害が発生した場合、分散キャッシュからデータを取得して、キャッシュをバイパスする大量のリクエストを回避できます。データベースに直接クエリを実行します。

  6. ホットスポット データが期限切れにならないように設定します。

9. キャッシュ雪崩

キャッシュなだれとは、同時アクセスが多い状態で、キャッシュ内の大量のデータが同時に失敗したり、キャッシュ サービスが利用できなくなったりして、大量のリクエストがデータベースに流入し、その結果、リクエストが突然急増することを指します。データベースに負荷がかかり、システムの安定性とパフォーマンスに重大な影響を及ぼします。キャッシュ雪崩は通常、キャッシュ サーバーのダウンタイムやキャッシュ データの有効期限が同時に切れるなどの要因によって発生します。

キャッシュの故障とは異なり、キャッシュなだれは、特定のホット データのアクセス頻度が非常に高いことが原因ではなく、キャッシュ内の大量のデータが同時に無効になったり、キャッシュ サービスが利用できなくなったりすることによって発生します。

アバランシェをキャッシュするソリューションには通常、次のタイプがあります。

  1. データ分散: キャッシュ サーバーのダウンタイムやデータ障害が同時に発生することによって引き起こされる問題を回避するために、キャッシュ内のデータをさまざまなサーバーに均等に分散します。

  2. 電流制限: キャッシュ障害が発生した場合に、同時リクエスト数を制御し、瞬間的に大量のリクエストが殺到することを回避するために、電流制限方式が採用されています。

  3. バックアップ キャッシュ: キャッシュ内のデータを別のキャッシュ サーバーまたはローカル ファイル システムにバックアップします。キャッシュに障害が発生した場合、またはサービスが利用できない場合は、バックアップからデータを迅速に復元できるため、キャッシュをバイパスする大量のリクエストを回避し、データベースに直接クエリを実行します。

  4. サービスのダウングレード: キャッシュに障害が発生するかサービスが利用できない場合、コア機能の通常の動作を確保するために、サービスのダウングレードによって一部の機能またはインターフェイスを一時的にシールドできます。

  5. キャッシュの有効期間のランダム性を高める: キャッシュ内のランダムな有効期間を増やし、同時に多数のキャッシュが無効になることによって引き起こされるキャッシュなだれの問題を回避します。

10. キャッシュ汚染 (またはフル)

キャッシュ汚染問題とは、キャッシュ内の一部のデータが 1 回または数回しかアクセスされず、一度アクセスされると二度とアクセスされないにもかかわらず、データのこの部分が依然としてキャッシュ内に残り、キャッシュ領域を消費することを指します。

データが増加し続けるとキャッシュ汚染が徐々に現れ、サービスの実行を続けると、二度とアクセスされない大量のデータがキャッシュ内に存在することになります。キャッシュ スペースには限りがあるため、キャッシュ スペースがいっぱいになると、キャッシュにデータを書き込むときに追加のオーバーヘッドが発生し、Redis のパフォーマンスに影響します。追加のオーバーヘッドのこの部分は主に、書き込み時の削除戦略の判断、削除戦略に従って削除するデータの選択、および削除操作の実行を指します。

ソリューションには通常、次のタイプがあります。

1. 最大キャッシュ サイズを設定する

システムの設計選択はトレードオフのプロセスです。大容量のキャッシュはパフォーマンスの高速化のメリットをもたらしますが、コストが高くなります。また、小容量のキャッシュは必ずしもアクセスを高速化する効果があるとは限りません。一般的には、アクセスパフォーマンスとメモリ領域のオーバーヘッドを考慮して、キャッシュ容量を総データ量の 15% ~ 30% に設定することをお勧めします。

Redis の場合、キャッシュの最大サイズ (4 GB など) を決定したら、次のコマンドを使用してキャッシュのサイズを設定できます。

ただし、キャッシュがいっぱいになることは避けられないため、データを削除する戦略が必要です。

CONFIG SET maxmemory 4gb

 2. キャッシュ削除戦略を使用する

11. Redis は合計 8 つの排除戦略をサポートします

Redis は、noeviction、volatile-random、volatile-ttl、volatile-lru、volatile-lfu、allkeys-lru、allkeys-random、および allkeys-lfu 戦略という合計 8 つの消去戦略をサポートしています。

どうやって理解しますか?主に次の 3 つのカテゴリに分類されます。

排除されていない

  • noeviction (v4.0 以降のデフォルト) では、メモリが不十分な場合、新しい書き込み操作でエラーが報告されます。

有効期限を設定してデータを削除する

  • Random: volatile-random、すべてのキーから一部のキーがランダムに削除されます。この戦略は、Redis に保存されているデータに重要性の区別がなく、一部のキーをランダムに削除してもデータに大きな影響を与えない状況に適しています。
  • ttl: volatile-ttl では、有効期限が設定されているキーのうち、残り時間が最も短いキーが削除されます。この戦略は、Redis に保存されているデータに重要な違いがあり、有効期限の短いデータが優先的に削除される状況に適しています。
  • lru: volatile-lru は、LRU アルゴリズムを使用してすべてのキーから削除します。つまり、最も最近使用されていないキーを削除します。この戦略は、Redis に保存されているデータに重要性の区別がない状況に適しています。
  • lfu: volatile-lfu は、有効期限が設定されているキーの中から、LFU アルゴリズムを使用して削除、つまり使用頻度が最も低いキーを削除します。この戦略は、Redis に保存されているデータに重要な特徴があり、使用頻度の低いデータが優先的に削除される状況に適しています。

すべてのデータを消去する

  • Random: allkeys-random、すべてのキーから、いくつかのキーをランダムに削除します。この戦略は、Redis に保存されているデータに重要性の区別がなく、一部のキーをランダムに削除してもデータに大きな影響を与えない状況に適しています。
  • lru: allkeys-lru は、LRU アルゴリズムを使用してすべてのキーから削除します。つまり、最も最近使用されていないキーを削除します。この戦略は、Redis に保存されているデータに重要性の区別がない状況に適しています。
  • lfu: allkeys-lfu は、すべてのキーから LFU アルゴリズムを使用して削除します。つまり、最も頻度の低いキーを削除します。この戦略は、Redis に保存されているデータに重要性の区別がない状況に適しています。

12. データベースとキャッシュの一貫性

キャッシュを使用するときに最も一般的な問題の 1 つは、キャッシュとデータベース間の一貫性の問題です。キャッシュとデータベースは独立したシステムであるため、データの更新や削除を行うと、キャッシュ内のデータが期限切れになったり、無効になったりして、キャッシュ内のデータとデータベース内のデータに不整合が生じる可能性があります。これにより、次のような問題が発生する可能性があります。

  1. ダーティ データの問題: キャッシュ内のデータの有効期限が切れているか、期限が切れているにもかかわらず、クライアントは依然としてキャッシュからデータを取得します。これにより、エラーや不正確な結果が発生する可能性があります。

  2. データ損失の問題: データベース内のデータが削除されても、キャッシュ内のデータがまだ存在するため、キャッシュ内のデータの不整合が発生します。

これらの問題を解決するには、データベース内のデータが更新または削除されたときに、対応するキャッシュ データも更新または削除されるようにする必要があります。データベースとキャッシュ間の一貫性を確保するには、次の戦略を使用できます。

1. 遅延二重削除スキーム

これはシンプルで効果的なソリューションであり、その基本的な考え方は、データベースを更新するときに最初にキャッシュ内のデータを削除し、次にデータベースを更新し、最後にキャッシュ内のデータを再度削除することです。これにより、キャッシュが無効になったときにデータベースから古いデータが読み取られなくなります。

ただし、キャッシュの削除とデータベースの更新には時間がかかるため、キャッシュが無効になる前にデータベースの更新が完了するようにコード内に適切な待ち時間を追加する必要があります。さらに、待機時間中に他の操作によってキャッシュが書き換えられた場合、この方式は失敗する可能性があります。

2. キャッシュスキームを更新する

このソリューションの中心的な考え方は、最初にデータベースを更新し、次にデータベースの更新時にキャッシュ内のデータを更新することです。これにより、キャッシュ内のデータが常に最新であることが保証されます。

ただし、このソリューションには問題があります。複数のリクエストが同じデータを同時に更新すると、ダーティ データがキャッシュに表示される可能性があります。この問題を解決するには、分散ロックまたは楽観的ロックを導入して同時更新を回避します。

3. 二重書き込み一貫性スキーム

このソリューションの中心となるアイデアは、データベースの更新と同時にキャッシュ内のデータも更新して、キャッシュ内のデータとデータベース内のデータが常に一貫していることを保証することです。

ただし、この解決策には問題があります。データベースの更新に失敗し、キャッシュ内のデータが更新された場合、キャッシュ内のデータはダーティ データになります。この問題を解決するには、トランザクションを使用してデータの整合性を確保し、データベースの更新に失敗した場合にトランザクションをロールバックし、キャッシュ内のデータもロールバックします。さらに、リードアフターライト一貫性スキームを使用して、最初にデータベースを更新し、次にキャッシュを更新して、キャッシュ内のデータが最新であることを確認することもできます。キャッシュされた読み取りデータの有効期限が切れている場合は、データベースからデータを再度読み取ります。

4. メッセージキューを使用する

データ更新操作をメッセージ キューに入れることにより、最初にデータベースが更新され、次にメッセージ キューを介して非同期的にキャッシュが更新され、キャッシュとデータベースのデータの一貫性が確保されます。キャッシュとデータベース間の直接のやり取りを回避しながら、メッセージ キューを通じて信頼性とパフォーマンスの高い非同期更新を実現できます。メッセージキューを使用するとシステムの複雑さと遅延が増加するため、実際の状況では考慮する必要があることに注意してください。

おすすめ

転載: blog.csdn.net/qq_33129875/article/details/129468452