インタビューの準備:Redisの一般的なインタビューの質問の概要

1. Redisを紹介する

Redisは、C言語で記述された高性能のKey-Valueデータベースです

特徴:

  • 非常に高いパフォーマンス、最大100,000回/秒の読み取りおよび書き込み速度
  • データの永続性をサポートし、コピーオンライト技術を使用してデータ更新し、非同期でディスクに保存できます
  • 豊富なデータ型、文字列(文字列)、リスト(リスト)、ハッシュ(辞書)、セット(コレクション)、ソートされたセット(順序付きコレクション)
  • 原子性:すべてのRedis操作はアトミックであり、複数の操作はMULTIおよびEXEC命令によるトランザクションをサポートします
  • 豊富な機能:キーの有効期限、パブリッシュ/サブスクライブ、通知
  • データバックアップ、高速マスタースレーブレプリケーションをサポート
  • ノードクラスター、複数のRedisインスタンスにデータを簡単に分散
  • シングルスレッド:不要なコンテキストの切り替えと競合状態を回避

目的:
キャッシュ。
分散ロック。
シングルサインオン共有セッション。
カウンター。

2.なぜRedisはそんなに速いのですか?

1.それは完全にメモリ基づいており、ほとんどのリクエストは純粋にメモリ操作であり、非常に高速です。データはHashMapと同様にメモリに格納されます。HashMapの利点は、検索と操作の時間の複雑さがO(1)であることです。

2. ハッシュ、ジャンプテーブルなど、データ構造はシンプルで効率的です

3. シングルスレッドを使用すると、不必要なコンテキストの切り替えと競合状態が回避され、CPUを消費するマルチプロセスまたはマルチスレッドの切り替えがありません。さまざまなロックの問題を考慮する必要がありません。ロックの解放操作はありません。デッドロックの可能性によるパフォーマンスの消費。

4. 複数のI / O多重化モデル、非ブロッキングIOを使用します。

5.基礎となるモデルが異なります。基礎となる実装とクライアントとの通信用のアプリケーションプロトコルが異なります。Redisが直接VMメカニズムを直接構築します。一般的なシステムがシステム関数を呼び出すと、移動に時間がかかりますそしてリクエスト;

3. Redisはどのデータ型をサポートしていますか?

Redisは5つのデータ型をサポートしています

文字列:文字列
ハッシュ:ハッシュ
リスト:リスト
セット:セット
ソートセット:順序セット

4. RedisとMemcachedの違いは何ですか?

現時点ではそれをしないでください。

5. Redisジャンプテーブルとは何ですか?

スキップテーブルは、順序付けられた単一リンクリストに基づいています。リンクリストに基づいて、各ノードには1つのポインタだけでなく、後続のノードへの複数のポインタも含まれているため、不要なノードをスキップして検索を高速化できます。 、削除およびその他の操作。
ここに画像の説明を挿入

6.ホットデータとコールドデータの分離とは何ですか。VMメカニズムとは何ですか?

RedisはVMを使用しており、VM機能を介してホットデータとコールドデータを分離できます。ホットデータをメモリに保持し、コールドデータをディスクに保存します。これにより、メモリ不足によるアクセス速度低下の問題を回避できます。

コールドデータは、アクセス頻度が低いが削除できない情報です。

7. Redisの期限切れのキーの削除戦略は何ですか?

遅延削除:期限切れのキーを積極的に削除しないでください。キースペースからキーを取得する場合は、取得したキーが期限切れかどうかを確認し、期限切れのキーを削除します。期限が切れない場合は、
定期的な削除に戻ります。期限切れのキーを削除するために定期的にデータベースを確認しますキー。削除される期限切れのキーの数とチェックされるデータベースの数は、アルゴリズムによって決まります。

参照:JavaアーキテクチャExpress train-Redisキャッシュ有効期限処理およびメモリ削除メカニズム

8. Redisの同期メカニズムについて教えてください。

バージョン2.8以前

Redisは、同期とコマンド伝達の2つの操作で同期を完了します

同期(同期):スレーブノードのデータベースステータスをマスターのデータベースステータスと一致するように更新します。

スレーブノードはSYNC命令をマスターノードに送信します
。SYNCノードを受信すると、マスターノードはBGSAVE命令を実行し、バックグラウンドでRDBファイルを生成し、バッファを使用して、これから実行されるすべての書き込み命令を記録します。
マスターノードのBGSAVE命令が実行されると、 RDBファイルはスレーブノードに送信されます。
スレーブノードはRDBファイルを受信して​​ロードし、マスターノードがBGSAVE命令を実行すると、データベースの状態をデータベースの状態に更新します。
スレーブノードはRDBファイルのロードを完了し、すべての書き込み命令をバッファーに記録するようマスターノードに通知します。スレーブノードに送信します。スレーブノードはこれらの書き込み命令を実行して、データベースステータスをマスターの現在のデータベースステータスに更新します。

コマンドの伝播:マスターノードのデータが変更され、実行された書き込みコマンドがスレーブノードにアクティブに送信されます。スレーブノードが実行された後、2つのノードのデータステータスは一貫したままです。

マスタースレーブノード切断の非効率的なレプリケーションの問題を解決するために(SYNCプロセス中にRDBファイルを生成、転送、およびロードすると、CPU、メモリ、およびディスクIOリソースが大量に消費されます)、バージョン2.8にPSYNC命令が追加されました。

PSYNCには2つのモードがあります

完全な再同期。基本的にはSYNCプロセスと同じです。
部分的な再同期。レプリケーションオフセット、レプリケーションバックログバッファー、サーバー操作IDを使用して、マスター/スレーブノードが切断された後、スレーブノードがマスターに再接続します。ノードが許可した後、マスターノードは切断中に実行された書き込みコマンドをスレーブノードに送信し、スレーブノードは書き込みコマンドを受信して​​実行し、データベースをマスターノードの現在の状態に更新します

9.パイプラインの利点は何ですか?

複数の命令間に依存関係はありません。パイプラインを使用して複数の命令を一度に実行でき、IOを削減して時間を短縮できます。

10. Redisは分散ロックを実装していますか?

参照:Javaアーキテクチャは、Redisに基づいてtrain-Set NXを表現し、分散ロックを実現します

11. Redisはべき等ですか?

べき等性を確保する必要がある各要求に対して一意の識別トークンを作成し、最初にトークンを取得して、トークンをredisに格納します。インターフェースを要求するときに、このトークンをヘッダーまたは要求インターフェースに要求パラメーターとして入れ、バックエンドインターフェースがredisを判断します。このトークンは次の場所に存在しますか?

存在する場合は、ビジネスロジックを通常どおりに処理し、トークンをredisから削除します。次に、それが繰り返し要求である場合は、トークンが削除されているため、検証に合格できません。操作を繰り返さないようにという通知に戻ります。

12.どのRedisクライアントに連絡しましたか?

リディソン

利点:

分散開発
APIスレッドセーフに適した分散特性とスケーラブルなJavaデータ構造を実現
Nettyフレームワークに基づくイベント駆動型通信は、非同期的に呼び出すことができます。
欠点:

APIはより抽象的で、学習と使用のコストが高い

ジェダイス

利点:

Redisのは、APIのより包括的な動作特性提供
の基本的な手順は、Redisの、使用にシンプルで理解しやすいと対応するAPI
短所:

同期ブロッキングIO
は、
安全でない非同期スレッドをサポートしていませ

レタス

利点:


非同期で呼び出すことができるNettyフレームワークに基づくスレッドセーフのイベント駆動型通信
分散キャッシュに適用可能
欠点:

APIはより抽象的で、学習と使用のコストが高い

13. Redisハッシュスロット?

Redisクラスターは一貫したハッシュを使用しませんが、ハッシュスロットの概念を導入しています。

Redisクラスターには16384のハッシュスロットがあり、各キーはCRC16アルゴリズムによって計算されます。16384を法として、0-16383の間の対応するハッシュスロットに配置されます。クラスターの各ノードは、ハッシュスロットの一部を担当します。

14. Redisクラスターは書き込み操作を失いますか?

以下の条件により、書き込み操作が失われる可能性があります。

期限切れのキーがクリアされます。
最大メモリが不足しているため、Redisは一部のキーを自動的にクリアしてスペースを節約します。
マスターライブラリは障害後に自動的に再起動し、スレーブライブラリは自動的に
個別のマスターソリューションとバックアップソリューションを同期します。不安定なネットワークは、セントリーをトリガーしてマスターノードとスレーブノードを自動的に切り替えます。データ損失

15.すべてのホットデータがRedisに保存されていることを確認するにはどうすればよいですか?

Redisに保存されたデータが構成されたサイズに達すると、データは削除されます

allkeys-lru戦略を使用して、データセット(server.db [i] .dict)から最も最近使用されていないデータを選択して、それらを最初に削除します。これにより、ホットデータを保存する必要を満たすことができます

16.キャッシュの浸透、故障、雪崩?

参照:Java Architecture Express Train-Redisキャッシュの浸透/内訳/雪崩

17.ホットスポットキー?

キャッシュ内の一部のキーの値(おそらくアプリケーションとプロモーションアイテムの場合)はクラスター内のマシンに格納されるため、すべてのトラフィックが同じマシンに流れ、システムのボトルネックになります。この問題の課題は、マシンの増加に対応できないことです。解決する能力。(キーが失敗すると、多数のスレッドがキャッシュを構築するため、負荷が増加します)

解決策:

  1. クライアントホットスポットキーのキャッシュ:値に対応するホットスポットキーをクライアントでローカルにキャッシュし、有効期限を設定します。読み取りリクエストごとに、ローカルキャッシュにキーが存在するかどうかを最初に確認し、存在する場合は直接返し、存在しない場合は分散キャッシュマシンにアクセスします。
  2. ホットスポットキーを複数のサブキーに分散し、それらをキャッシュクラスター内の異なるマシンに保存します。これらのサブキーに対応する値は、ホットスポットキーと同じです。ホットスポットキーでデータをクエリする場合、サブキーは特定のハッシュアルゴリズムによってランダムに選択され、キャッシュマシンにアクセスしてホットスポットを複数のサブキーに分散します。
  3. 各値に論理有効期限を設定します。論理有効期限を超えていることが判明した場合は、別のスレッドを使用してキャッシュを構築します。キャッシュレイヤーに有効期限が設定されていません(このソリューションは、多数のスレッドが待機する問題を解決できますが、データの不整合の問題を引き起こす可能性があります)
  4. ホットキーの失敗の場合、多数のスレッドがキャッシュを構築します(分散ロックを使用して、キャッシュを構築するスレッドは1つだけでこの問題を解決できます)。

18.大鍵(Big Key)?

Redisの使用中、多くの場合、さまざまな大きなキーが存在します。たとえば、単一の単純なキーが大きな値を格納します。
redisは単一のスレッドで実行されるため、1つの操作の値が大きい場合、redis全体の応答時間が悪影響を受け、IOネットワークの輻輳を引き起こします。

解決する:

保存および取得される大きなオブジェクトを複数の小さなオブジェクトに分割します。オブジェクトをいくつかのKey-Valueに分割し、multiGetを使用して値を取得することができます。分割の重要な点は、単一の操作の圧力を分割し、操作圧力を複数のredisインスタンスに分散し、単一のredisのIOを減らすことです影響力

19.底なし穴の問題?

今のところわかりません。

20.キャッシュとデータベースの一貫性の問題ですか?

リファレンス:キャッシュアーキテクチャ
リファレンス:分散DBとキャッシュの整合性

元の記事を431件公開しました 賞賛されました329 170,000回

おすすめ

転載: blog.csdn.net/No_Game_No_Life_/article/details/105513768