こんにちは、インタビュアー | アリは二面性があり、質問されてしびれを感じています。。

今号は、 [こんにちは、インタビュアー] シリーズ記事の第 21回目であり、継続的に更新されています。

「ハロー、インタビュアー」シリーズは現在20本連載されており、このシリーズを読んだ友人たちは皆大昌さんからオファーをもらっているそうですよ~

  • スター + サブスクリプションへようこそ。継続的に更新されています。学校採用における核となる面接戦略の作成に尽力します~
  • Java スクール採用面接 Web サイト: www.java2top.cn

テストサイトのクイックチェック

このテストには、、、、が含まれJVMますMySQL高级Redis持久化

本期题改编自 ——2023届春招 阿里 实习 二面

インタビューサイト

ディンディンディン…

面接官:「こんにちは、面接官のXXです。こちらは小龍さんですか?」

シャオロン:「こんにちは、面接官、私はシャオロンです」

面接官:「はい、空いていますか?面接を始めましょう。」

シャオロン「はい、準備完了です」

その他の質問(自己紹介、プロジェクト省略)

インタビュアー: 「あなたの履歴書には精通しているようですねJVM。system.gc() は gc をトリガーしますか? それは完全な gc とどのような関係がありますか?」

モノローグ:「トイレ、普段はこの件に関して全く気にしてなかったんだけど」

Xiaolong : " system.gc()Fullgc を表示してトリガーすると、古い世代と新しい世代を再利用し、役に立たないオブジェクトによって占有されているメモリを解放できます。最下層は を通じて呼び出されますRuntime . getRuntime() .gc()。"

Xiaolong : 「ただし、この表示呼び出しには免責事項が付いています。これは JVM のガベージ コレクターに Full Gc を実行するよう通知するだけです。これを実行するかどうかはコレクター次第です。」

インタビュアー: 「わかりました、Redis の永続性については理解しましたか?」

Xiaolong : 「え、その通りです。Redis は、停止後にデータを確実に回復できるように永続化メソッドを提供します。RDB と AOF を永続化に使用できます。Redis4.x 以降は、RDB と AOF のハイブリッド永続化をサポートします。」

インタビュアー: 「AOF 永続化メカニズムについてはどうですか?」

Xiaolong : 「簡単に言うと、AOF ファイルは書き込み操作コマンドを合意された形式で保存し、ダウンタイムの場合でもコマンドを順番に実行すればデータを復元できます。また、「書き込み後ログ」モードを採用しています。つまり、Redis は最初にコマンドを実行してメモリに書き込み、次にログを書き込みます。

インタビュアー: 「なぜポストロギングを使用するのですか?」

Xiaolong : 「そうですね、まず、Redis はコマンドを実行してメモリに書き込みます。これにより、間違ったコマンドがログに記録されるのを防ぐためにコマンドを事前にチェックできます。同時に、AOF ログを記録するときにも実行されます。構文をチェックする必要がないため、書き込み後のログでも追加のオーバーヘッドを回避できます。」

Xiaolong : 「また、ログはコマンドの実行後に書き込まれるため、メインプロセスの書き込み操作がブロックされることはありません。」

インタビュアー: 「先ほど、AOF は常にコマンドを追加していると言いました。時間が経つにつれて、この AOF ファイルはどんどん大きくなっていきませんか? Redis はそれをどのように処理しますか?」

Xiaolong : 「AOF ファイルがどんどん大きくなるのを防ぐために、Redis は AOF 書き換えメカニズムを提供しています。」

モノローグ: 「シャオロンのインタビューの典型的な分析は、詳細にまとめられた[インタビュー ノート]に完全に記録されています。」

インタビュアー: 「書き換えのメカニズムはどのようなものですか?」

Xiaolong : 「簡単に言うと、まず、AOF に格納されている書き込み操作コマンドを知る必要がありますが、多くの実行コマンドの可能な効果は、最終的にはわずか数個のコマンドで実現できます。」

Xiaolong : 「書き換えとは、冗長なコマンドを新しいコマンドに置き換え、次に新しいコマンドを新しい AOF ファイルに記録し、最後に古い AOF ファイルを置き換えることを意味します。」

インタビュアー: 「書き込み量が多いと、スレッドが長時間ブロックされてしまいます。Redis はシングルスレッドなので、クライアントのリクエストコマンドを処理できません。どうすればよいでしょうか?」

Xiaolong : 「メイン プロセスは、bgrewriteaof 子プロセスをフォークすることによって aof ログを書き換えます。バックグラウンドで新しく開かれたプロセスが書き換えられるため、メイン プロセスはコマンド リクエストの処理を続行し、メイン プロセスのブロックを回避できます。」

Xiaolong : 「ただし、子プロセスをフォークする操作はメインプロセスでも実装されています。親プロセスのページテーブルなどのデータ構造をコピーする必要があるため、ページテーブルが大きすぎるとメインスレッドがダウンしてしまう可能性があります。ブロックされるよ。」

インタビュアー: 「では、元のデータを書き込んでいるときに親プロセスが新しいコマンドを処理すると、子プロセスと親プロセスの間でデータの不整合が発生しますか?」

モノローグ:「これは見せかけだよ~」

Xiaolong : 「サブプロセスがログを書き換えるとき、新しいデータが書き込まれると、メインプロセスはコマンドの実行後に「 AOF バッファ」と「AOF 書き換えバッファ」にコマンドを書き込みます。

Xiaolong : 「その後、子プロセスが書き換えられた後、メインプロセスに非同期でシグナルを送信します。」

Xiaolong : 「メイン プロセスが情報を受け取ると、AOF 書き換えバッファ内のすべての内容を新しい AOF ファイルに追加し、最後にファイル名を変更し、古いファイルをアトミックに切り替えて、データの整合性を確保するための書き換えを完了します。」

インタビュアー: 「では、AOF を開くにはどうすればよいですか?」

Xiaolong : 「手動またはファイル構成によってトリガーできます。」

インタビュアー:「それはどうですか?」

Xiaolong : 「redis.conf ファイルを設定することで AOF の永続性を有効にできますappendonly yes。同時に、同期戦略とトリガーのタイミングを一緒に設定する必要があります。ただし、AOF の書き換えにはフォークが必要ですが、これは負荷の高い操作であり、問​​題が発生する可能性があります。 Redis へのブロック。」

Xiaolong : 「そのため、Redis メインプロセスの応答に影響を与えないようにするには、フォークの頻度をできるだけ減らしてブロックを減らす必要があります。bgrewriteaof を通じて AOF の書き換えを手動でトリガーできます。」

面接官: 「わかりました。履歴書に MySQL と書いてありますが、MySQL の 2 段落提出とは何ですか?」

Xiaolong : 「実際、いわゆる 2 フェーズとは、物事を 2 つのフェーズ (準備、コミット) に分けてコミットすることですが、実際に 2 フェーズ コミットを有効にするのは、REDOLOG と BINDLOG のログ データのセキュリティと一貫性を確保するためだけです。 。」

Xiaolong : 「ログ バックアップに binlog をまったく使用する必要がない場合、マスター/スレーブ レプリケーションに 2 フェーズ コミットは必要ありません。REDO ログがディスクに正常に書き込まれたことを確認するだけで、クラッシュ。"

面接官:「提出方法を教えていただけますか?」

Xiaolong : 「あなたは完全な分析を行うことができます。今、データの一部を更新する必要がある場合、あなたは権威を判断し、単語の構文を分析し、オプティマイザーが最適な実行計画を生成することを知っておく必要があります。実行の準備ができました。実行前に、ロールバック用のアンドゥログも記録されます。その後、ストレージ エンジンの呼び出しを開始して SQL を実行します。」

Xiaolong : 「この時点で InnoDB エンジンを選択した場合、バッファ プールに関連するデータがあるかどうかを確認します。存在しない場合、データは更新のためにバッファ プールにロードされます。」

独白「もちろん、独自インデックスや通常インデックスなどの細かいことも含まれます。ここでは詳しくは述べません。詳しくは【取材メモ】をご覧ください」

Xiaolong : 「最後のメモリ データが更新された後、更新操作は REDO ログに記録され、REDO ログは準備状態になり、実行者に実行を完了してトランザクションを送信するよう指示します。」

Xiaolong : 「実行プログラムは、この操作のバイナリログを生成し、バイナリログをディスクに書き込みます。実行プログラムはエンジンのトランザクションコミットインターフェイスを呼び出し、エンジンは新しく書き込まれた REDO ログをコミット状態に変更し、最終的に更新が完了します。」

Xiaolong : 「これでプロセス全体が完了し、最終トランザクションは 2 段階で送信されます。」

インタビュアー: 「わかりました。Explain を使用したことがありますか。Explain ステートメントは SQL を実行しますか?」

Xiaolong : "explain はオプティマイザにのみ送信され、スキャンされる行数は推定にすぎず、実際には実行されません。これはオプティマイザから SQL 実行に関する情報を生成する実行プランにすぎませんが、クエリがFROM 句のサブクエリが含まれている場合、MySQL がサブクエリを実行します。」

モノローグ:「さすが、俺は本物の男だ!【面接メモ】 【面接メモ】があれば、大手工場からのオファーも心配ない。」

知識のまとめ

今回は、面接シミュレーションを通してアリの二面性を復元していきます。更新をフォローし続けるには、購読 + スターを付けてください。

インタビューの焦点

Redis 持久化机制MySQL undoLog 日志

おすすめ

転載: blog.csdn.net/qq_43666365/article/details/130540098