Redis の面接でよく聞かれる 12 の重要なポイント (回答付き)
この記事では、面接中によく聞かれる質問の概要を紹介します Redis.面接官が Redis のトピックを段階的に詳しく掘り下げていく様子をシミュレートし、候補者の Redis に対する理解を総合的に調査します。 Redis. 皆さんのお役に立てれば幸いです。
推奨調査: 「2022 最新の Redis 面接の質問と回答 」
Redis 面接でよくある質問 12 のキーポイント
面接では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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

Redisデータをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

Redisソースコードを理解する最良の方法は、段階的に進むことです。Redisの基本に精通してください。開始点として特定のモジュールまたは機能を選択します。モジュールまたは機能のエントリポイントから始めて、行ごとにコードを表示します。関数コールチェーンを介してコードを表示します。 Redisが使用する基礎となるデータ構造に精通してください。 Redisが使用するアルゴリズムを特定します。

Redisのすべてのキーを表示するには、3つの方法があります。キーコマンドを使用して、指定されたパターンに一致するすべてのキーを返します。スキャンコマンドを使用してキーを繰り返し、キーのセットを返します。情報コマンドを使用して、キーの総数を取得します。

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。
