Redis パフォーマンスのボトルネックを解明する: 大きな重要な問題を最適化するには?

この記事は参加しています「ゴールデンストーンプロジェクト」

1. Redis の大きな重要な問題とは何ですか

Redis の大きなキーの問題とは、特定のキーに対応する値が占める比較的大きなメモリ空間を指します。これにより、Redis のパフォーマンスの低下、メモリ不足、データの不均衡、マスターとスレーブの同期遅延などの問題が発生します。

どれくらいのデータが大きなキーとみなされますか?

明確な基準はありませんが、一般的に文字列型のキーに対応する値が1M以上の領域を占めるか、コレクション型のk要素数が10,000を超える場合が大きなキーと考えられます。

Redis の大きなキー問題の定義と評価基準は静的なものではなく、Redis の実際のアプリケーションとビジネス ニーズに応じて総合的に評価する必要があります。たとえば、同時実行性が高く遅延が短いシナリオでは、大きなキーを構成できるのは 10 kb だけですが、同時実行性が低く、大容量の環境では、大きなキーの制限が 100 kb になる可能性があります。したがって、Redis を設計して使用する場合は、ビジネス要件とパフォーマンス指標に基づいて、合理的な大きなキーのしきい値を設定する必要があります。

2. 大きなキーの影響

  1. メモリ使用量が高すぎます。大きなキーは多くのメモリ領域を占有するため、使用可能なメモリが不足する可能性があり、メモリ排除戦略がトリガーされます。極端な場合には、メモリが枯渇し、Redis インスタンスがクラッシュし、システムの安定性に影響を与える可能性があります。
  2. パフォーマンスが低下します。大きなキーは大量のメモリ領域を占有するため、メモリの断片化が増加し、Redis のパフォーマンスに影響します。読み取り、書き込み、削除などの大きなキーを使用した操作は、より多くの CPU 時間とメモリ リソースを消費し、システム パフォーマンスをさらに低下させます。
  3. 他の操作をブロックします。大きなキーに対する特定の操作により、Redis インスタンスがブロックされる可能性があります。たとえば、DEL コマンドを使用して大きなキーを削除すると、Redis インスタンスが一定期間他のクライアント リクエストに応答できなくなり、システムの応答時間とスループットに影響を与える可能性があります。
  4. ネットワークの混雑。大きなキーを取得するたびに大量のネットワーク トラフィックが生成され、マシンまたは LAN の帯域幅が最大限に活用され、同時に他のサービスに影響を与える可能性があります。たとえば、大きなキーは 1MB を占有し、1 秒あたり 1000 回のアクセスがあると 1000MB のトラフィックが発生します。
  5. マスターとスレーブの同期遅延。Redis インスタンスがマスター/スレーブ同期で構成されている場合、キーが大きいとマスター/スレーブ同期に遅延が発生する可能性があります。大きなキーはより多くのメモリを占有するため、同期プロセス中に大量のデータを送信する必要があり、マスターとスレーブ間のネットワーク送信遅延が増加し、データの一貫性に影響します。
  6. データの偏り。Redis クラスター モードでは、特定のデータ フラグメントのメモリ使用量が他のデータ フラグメントよりもはるかに高く、データ フラグメントのメモリ リソースのバランスをとることができません。さらに、Redis メモリが maxmemory パラメータで定義された上限に達し、重要なキーが削除されたり、メモリ オーバーフローが発生したりする可能性もあります。

3. 大きな鍵の理由

  1. 事業設計に無理がある。これが最も一般的な理由であり、大量のデータを 1 つのキーに保存せず、複数のキーに分散する必要があります。たとえば、国のデータを州や行政区域ごとに 34 のキーに分割したり、都市ごとに 300 のキーに分割したりすると、大きなキーが生成される確率をさらに減らすことができます。
  2. 価値が動的に増大するという問題は予測されていません。削除メカニズム、有効期限メカニズム、または数の制限なしで価値データを追加し続けると、遅かれ早かれ大きなキーが出現します。例: Weibo スターのファンリスト、人気のあるコメントなど。
  3. 有効期限が正しく設定されていません。特定のキーに有効期限が設定されていない場合、または有効期限が長く設定されている場合。時間が経つにつれて、値の数は急速に蓄積され、最終的には大きなキーが形成されます。
  4. プログラムのバグ。一部の異常な状況により、一部のキーのライフサイクルが予想を超えたり、値の数が異常に増加したり、大きなキーも生成されます。

4. 大きなキーのトラブルシューティング方法

4.1 SCANコマンド

Redis の SCAN コマンドを使用すると、データベース内のすべてのキーをステップ実行できます。他のコマンド (STRLEN、LLEN、SCARD、HLEN など) と組み合わせると、大きなキーを識別できます。SCAN コマンドの利点は、Redis インスタンスをブロックせずに走査できることです。

4.2 bigkeys パラメータ

redis-cli コマンド クライアントを使用して、Redis サービスに接続するときに --bigkeys パラメーターを追加して、各データ型の最大数を持つキーをスキャンします。

redis-cli -h 127.0.0.1 -p 6379 —bigkeys

4.3 Redis RDB ツールツール

オープン ソース ツールの Redis RDB Tools を使用して、RDB ファイルを分析し、大きな Redis キーをスキャンします。

例: 1kb を超えるメモリを占有する上位 3 つのキーを出力します。

rdb -commond メモリ - バイト 1024 - 最大 3 dump.rbd

5. 大きな鍵を解く方法

  1. 複数の小さなキーに分割します。これは、単一キーのサイズを削減するために、mget を使用してバッチで読み取ることができる最も簡単な方法です。
  2. データ圧縮。String 型を使用する場合は、圧縮アルゴリズムを使用して値のサイズを小さくします。または、基礎となるハッシュ タイプが圧縮リスト データ構造を使用するため、ハッシュ タイプ ストレージを使用します。
  3. 適切な有効期限を設定します。各キーの有効期限を設定し、有効期限が切れた後にデータが自動的にクリーンアップされるように適切な有効期限を設定し、長期間にわたって大量のキーが蓄積される問題を回避します。
  4. メモリ削除ポリシーを有効にします。LRU (Least Recent Used、最も最近使用されていない) などの Redis のメモリ削除戦略を有効にすると、メモリが不足した場合に、最も最近使用されていないデータが自動的に削除され、大きなキーが長時間メモリを占有することを防ぎます。
  5. データのシャーディング。たとえば、Redis Cluster を使用してデータを複数の Redis インスタンスに分散すると、単一インスタンスの負担が軽減され、大きな重要な問題が発生するリスクが軽減されます。
  6. 大きなキーを削除します。大きなキーを削除するには、UNLINK コマンドを使用します。UNLINK コマンドは、DEL コマンドの非同期バージョンです。Redis インスタンスのブロックを避けるために、バックグラウンドでキーを削除できます。

6. まとめ

ラージ キーの問題は Redis でよくある問題の 1 つであり、パフォーマンスの低下、メモリ使用量の増加、他の操作のブロック、マスターとスレーブの同期の遅延などの問題を引き起こす可能性があります。この記事では、大きなキーの原因、影響、検出方法と解決策を詳しく紹介します。データ構造の設計を最適化し、合理的なデータ有効期限ポリシーを設定し、システム アーキテクチャと構成を最適化し、大きなキーを段階的に削除することにより、大きなキーの問題を効果的に解決して防止することができ、それによって Redis システムの安定性とパフォーマンスが向上します。

私は「宜登建築」です。この記事が役に立ったら、ぜひ「いいね」、コメント、注目してください。退役軍人の皆様、ありがとうございます。次号でお会いしましょう

おすすめ

転載: juejin.im/post/7222825885203218491