この記事では、面接中によく聞かれる質問の概要を紹介します Redis.面接官が Redis のトピックを段階的に詳しく掘り下げていく様子をシミュレートし、候補者の Redis に対する理解を総合的に調査します。 Redis. 皆さんのお役に立てれば幸いです。
推奨調査: 「2022 最新の Redis 面接の質問と回答 」
面接ではRedisは避けては通れない敷居が高く、履歴書にRedisを使ったことがあると書く限り絶対に逃げられません。
シャオ・ジャン:
こんにちは、インタビュアー。面接に来ました。
インタビュアー:
こんにちは、シャオ・チャン。私はあなたの履歴書を読み、Redis に精通しているので、Redis 関連の質問をいくつかさせていただきます。まず最初に、私の質問は、Redis はシングルスレッドですか、それともマルチスレッドですか?
Xiao Zhang:
Redis のさまざまなバージョンで使用されるスレッド モデルは異なります。Redis バージョン 4.0 より前では、シングルスレッド モデルが使用され、バージョン 4.0 以降では、マルチスレッドのサポートが強化されました。
4.0 より前は、Redis がシングルスレッドであると述べましたが、それはネットワーク I/O スレッドと Set および Get 操作が 1 つのスレッドで完了することを意味するだけでした。ただし、Redis の永続化とクラスターの同期は、引き続き他のスレッドを使用して完了します。
4.0 以降、マルチスレッドのサポートが追加されました。これは主に、unlink key
、flushdb async
、 などのビッグ データの非同期削除機能に反映されています。 lushall async
お待ちください
インタビュアー:
答えはとても良いです。 では、なぜ Redis は 4.0 より前にシングル スレッドを使用することを選択したのでしょうか?シングルスレッドを使用するとそんなに速いのでしょうか?
Xiao Zhang:
シングルスレッドを選択する主な理由は、使いやすいこと、ロックの競合がないこと、ロックなしですべての操作を完了できること、そしてデッドロックやスレッドが発生しない 切り替えはパフォーマンスと時間のオーバーヘッドをもたらしますが、同時にシングルスレッドではマルチコア CPU のパフォーマンスを十分に発揮できません。
なぜシングルスレッドが速いのかというと、主に以下の理由が考えられます。
Redis のほとんどの操作はメモリ内で完結し、メモリ内での実行効率が低いためです。メモリ自体 高速で、ハッシュ テーブルやスキップ テーブルなどの効率的なデータ構造を使用します。
単一スレッドを使用すると、マルチスレッドの競合が回避され、マルチスレッドの切り替えによって発生する時間とパフォーマンスのオーバーヘッドが節約され、デッドロックが発生しません。
I/O 多重化メカニズムは、ノンブロッキング I/O モデルに基づいており、Redis が効率的に通信できるため、多数のクライアント ソケット リクエストを処理するために使用されます。ネットワーク経由では、I/O 読み取りおよび書き込みプロセスはブロックされなくなりました。
インタビュアー:
はい、Redis はどのようにしてデータ損失をゼロにできるのでしょうか?
Xiao Zhang:
Redis データはメモリに保存されています。Redis データが失われないようにするには、データをメモリからこれが Redis のデータ永続化です。 Redis データを永続化するには 3 つの方法があります。
AOF ログ (追加専用ファイル、ファイル追加モード): すべての操作コマンドを記録し、テキスト形式でファイルに追加します。
RDB スナップショット (Redis データベース): 特定の瞬間のメモリ データをバイナリ形式でディスクに書き込みます。
ハイブリッド永続化メソッド: Redis 4.0 では、RDB と AOF の利点を統合した新しいハイブリッド永続化メソッドが追加されています。
インタビュアー:
それでは、AOF と RDB のそれぞれの実装原則について話してください。
Xiao Zhang:
AOF は書き込み後ログを使用します。Redis はまずコマンドを実行してデータをメモリに書き込み、次にログをファイルに記録します。 AOF ログには実際のデータではなく運用コマンドが記録されるため、障害回復に AOF 方式を使用する場合はログ全体を実行する必要があります。
RDB はメモリ スナップショット方式を採用しており、操作ではなく、ある瞬間のデータを記録します。 RDB ファイルをメモリに直接読み込んで、迅速なリカバリを実現できます。
インタビュアー:
先ほど、AOF では「書き込み後ログ」方式が使用されているとおっしゃいましたが、私たちが通常使用している MySQL では「書き込み前ログ」方式が使用されています。では、 なぜですか? Redis は最初にコマンドを実行してからデータをログに書き込む必要がありますか?
シャオ・チャン: 額に汗が出てきました。質問は何ですか? 。 。
これは主に、Redis がコマンドをログに書き込む前にコマンドの構文をチェックしないため、間違ったコマンドの記録を避けるために正常に実行されたコマンドのみを記録し、書き込むことができないためです。コマンドの実行後にログが記録され、現在の書き込み操作がブロックされます。
インタビュアー:
の後に日記を書くリスクは何ですか?
シャオ・チャン:
私...どうすればいいのか分かりません。
インタビュアー:
そうですね、ログを書き込むときに発生する可能性のある主なリスクが 2 つあります:
データが失われる可能性があります: Redis の実行直後の場合コマンドに障害が発生すると、コマンドが失われる可能性があります。
他の操作をブロックする可能性があります: AOF ログは実際にはメインスレッドで実行されるため、Redis がログ ファイルをディスクに書き込むとき、後続の操作は引き続きブロックされ、実行できません。
まだ質問があります: RDB はスナップショットを取得するときにスレッドをブロックしますか?
Xiao Zhang:
Redis には、RDB スナップショット ファイルを生成するための 2 つのコマンド、save と bgsave が用意されています。保存コマンドはメインスレッドで実行されるため、ブロッキングが発生します。 bgsave コマンドは、RDB ファイルを書き込むための子プロセスを作成し、メイン スレッドのブロックを回避します。これは Redis RDB のデフォルト構成でもあります。
インタビュアー:
RDB スナップショットを作成するときにデータを変更できますか?
Xiao Zhang:
保存は同期的であり、クライアント コマンドをブロックします。bgsave 中に変更できます。
インタビュアー:
Sobgsave がスナップショットを取得するときにデータ変更が許可されるという問題を、Redis はどのように解決しますか?
Xiao Zhang: (なぜまだ質問するのですか...方法がわかりません!)
うーん、これについてはよくわかりません...
インタビュー公式:
これは主に bgsave
のサブスレッドを使用して実装されます。具体的な操作は次のとおりです:
メイン スレッドが実行する場合読み取り操作、メイン スレッドと bgsave
サブプロセスは相互に影響しません;
メイン スレッドが書き込み操作を実行すると、変更されたデータのコピーがコピーされます。次に bgsave
サブプロセスはコピー データ RDB ファイルを書き込みます。このプロセス中、メインスレッドは元のデータを直接変更できます。
Redis による RDB の実行頻度は非常に重要であることに注意してください。これはスナップショット データの整合性と Redis の安定性に影響するため、Redis 4.0 以降は、追加の AOF と RDB の混合データ永続化メカニズム : データを RDB 形式でファイルに書き込み、後続の操作コマンドを AOF 形式でファイルに保存します。これにより、確実に再起動されるだけでなく、 Redis の速度は向上しますが、データ損失のリスクも軽減されます。
シャオ・チャン:
勉強になりました。
インタビュアー:
それでは、Redis がどのようにして高可用性を実現しているのか教えていただけますか?
Xiao Zhang:
Redis で高可用性を実現するには、マスター/スレーブ レプリケーション、センチネル モード、Redis クラスターの 3 つの主な方法があります。
マスター/スレーブ レプリケーション
以前の Redis サーバーから複数のスレーブ Redis サーバーにデータを同期します (つまり、マスター/スレーブ モデル)。これは MySQL に似ています。マスター/スレーブ レプリケーションの原理は同じです。
Sentinel モード
Redis マスター/スレーブ サービスを使用すると、問題が発生します。マスター/スレーブサーバーが表示される 障害が発生した場合、手動で復旧する必要がある この問題を解決するために、Redis ではセンチネル モードが追加されました (センチネル モードはマスター サーバーとスレーブ サーバーを監視し、自動ディザスター リカバリー機能を提供するため)。
Redis クラスター (クラスター)
Redis クラスターは、Redis 3.0 に基づいた分散型および分散型のオペレーティング モードです。このバージョンで開始されたクラスター ソリューションは、データをさまざまなサーバーに分散して、システムの単一マスター ノードへの依存を軽減し、それによって Redis サービスの読み取りおよび書き込みパフォーマンスを向上させます。
インタビュアー:
センチネル モードを使用して、データのコピーが存在し、可用性を監視するセンチネルがあることを確認します。マスターがダウンすると、スレーブが選択されます。ノードはマスター ノードであり、実稼働環境のニーズをすでに満たしています。それでは、なぜ依然としてクラスター モードを使用する必要があるのでしょうか?
Xiao Zhang:
さて、センチネル モードは依然としてマスター/スレーブ モードです。マスター/スレーブ モードでは、スレーブ ノードを追加することで読み取り同時実行機能を拡張できます。書き込み容量とストレージ容量、ストレージ容量はマスターノードが搭載できる上限のみです。したがって、書き込み機能とストレージ機能を拡張するには、クラスター モードを導入する必要があります。
インタビュアー:
クラスター内には非常に多くのマスター ノードがあります。Redis クラスターは、保存するときにどのノードを選択するかをどのように決定しますか?
Xiao Zhang:
これはある種のハッシュ アルゴリズムを使用しているはずですが、よくわかりません。 。 。 ######インタビュアー: ###
はい、今日の面接はこれで終わりです。戻って面接の通知を待ちます。
Xiao Zhang:
わかりました、インタビュアーありがとうございます。Redis クラスターがノード選択をどのように実装するかを教えていただけますか?
インタビュアー:
Redis Cluster は、 一貫性のあるハッシュ アルゴリズムを使用してノード選択を実装します. 一貫性のあるハッシュ アルゴリズムが何であるかについては、戻って自分の目で確認してください。
Redis クラスターは、それ自体を 16384 個のスロットに分割します。ハッシュ スロットはデータ パーティションに似ています。各キーと値のペアは、そのキーに従ってハッシュ スロットにマッピングされます。具体的な実行プロセスは 2 つの主要なステップに分かれています。
CRC16 アルゴリズムに従って、キーと値のペアのキーに基づいて 16 ビット値を計算します。
次に、16 ビット値を 16384 を法として使用して、0 ~ 16383 の範囲の法を取得します。各法は、対応する番号を持つハッシュ スロットを表します。
各 Redis ノードは、スロットの一部の処理を担当します。マスター ノード ABC が 3 つある場合、各ノードが担当するスロットは次のとおりです:
これはクラスター ノードの選択を実装します。
推奨される学習: 「Redis ビデオ チュートリアル 」、「2022 年の最新 Redis 面接の質問と回答 」
以上がRedis の面接でよく聞かれる 12 の重要なポイント (回答付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。