この記事では、ギャップを確認して埋め、知識ポイントを向上させることができるように、Redis の面接での質問をいくつか紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
定期的な削除戦略: Redis では、タイマーですべてのキーを定期的に監視して、キーの有効期限が切れているかどうかを判断し、有効期限が切れた場合は削除します。この戦略では、期限切れのキーは最終的に確実に削除されますが、重大な欠点もあります。毎回メモリ内のすべてのデータを走査するため、大量の CPU リソースが消費されます。また、キーの期限が切れてもタイマーがまだ有効である場合があります。覚醒していない状態でも、キーはこの間も使用できます。
setnx は有効期限の設定をサポートしていません。分散ロックを実行するときは、特定のクライアントが中断されるのを避ける必要があります。ロックの場合は、ロックの有効期限を設定する必要があります。同時実行性が高い場合、Setnx と Expir はアトミック操作を実装できません。これを使用したい場合は、プログラム コードでロックを表示する必要があります。 SETNX の代わりに SET を使用することは、SETNX EXPIRE がアトミック性を達成することと同等であり、SETNX が成功し、EXPIRE が失敗することを心配する必要はありません。
従来の LRU はスタックを使用します。毎回、最後に使用されたものがスタックの先頭に移動されますが、その結果、select * 実行時にヘッダーデータに非ホットデータが大量に占有されるため、改善が必要です。 Redis はキーによって値を取得するたびに、値の lru フィールドを現在の第 2 レベルのタイムスタンプに更新します。 Redis の初期実装アルゴリズムは非常に単純で、辞書から 5 つのキーがランダムに取得され、lru フィールド値が最も小さいものが削除されます。 3.0 では、アルゴリズムの別のバージョンが改良され、最初にランダムに選択されたキーがプールに配置されます (プールのサイズは 16)。プール内のキーは LRU サイズの順に配置されます。次に、ランダムに選択された各 keylru 値は、プールがいっぱいになるまで追加され続ける前に、プール内の最小の lru より小さくなければなりません。いっぱいになった後は、新しいキーを挿入する必要があるたびに、プール内で最大の lru を持つキーを取り出す必要があります。削除する場合は、プールから最小 lru 値を直接選択して削除します。
経験に基づいて予測します。たとえば、アクティビティの開始が事前にわかっている場合は、次のようにします。次に、このキーをホットスポット キーとして使用します。
サーバー側の収集: Redis を操作する前に、データ統計用のコード行を追加します。
評価用のパケットのキャプチャ: Redis はクライアントとの通信に TCP プロトコルを使用します。通信プロトコルは RESP を使用するため、パケットを監視する独自のプログラムを作成することで、分析のためにパケットをインターセプトすることもできます。ポート。
プロキシ層では、各 Redis リクエストが収集され、報告されます。
Redis にはコマンド クエリが付属しています。Redis4.0.4 バージョンでは、ホット キーを見つけるための redis-cli –hotkeys が提供されます。 (Redis 独自のコマンドを使用してクエリを実行する場合は、最初にメモリエビクション ポリシーを allkeys-lfu または volatile-lfu に設定する必要があることに注意してください。そうしないと、エラーが返されます。Redis に入り、config set maxmemory-policy allkeys を使用します。 -lfu.)
サーバー側キャッシュ: ホットスポット データをサーバーのメモリにキャッシュする(Redis に付属のメッセージ通知メカニズムを使用して、Redis とサーバーのホットスポット キー間のデータの一貫性を確保し、ホットスポット キー クライアントのモニターを確立します。ホットスポット キーが更新されると、サーバーもそれに応じて更新されます。)
Backup Hotspot Key: ホットスポット キーの乱数を他の Redis ノードにランダムに配布します。このようにすると、ホットスポット キーにアクセスするときに、すべてが同じマシンにアクセスすることはなくなります。
Redis 高可用性アーキテクチャを使用する: Redis クラスターを使用して、 Redis サービスがクラッシュしないことを確認します。
キャッシュ時間に一貫性がありません。集団的な障害を避けるために、キャッシュの有効期限にランダムな値を追加します。
現在の制限付きダウングレード戦略: 特定の申請があります。たとえば、パーソナライズされたレコメンデーション サービスは利用できなくなりました。ホット データ レコメンデーション サービスに置き換えられます
インターフェイスで確認
#null 値を保存 (キャッシュのブレークダウンとロック、または期限切れにならないように設定) )
ブルーム フィルター インターセプト: 最初にすべての可能なクエリ キーをブルーム フィルターにマッピングします。クエリを実行するときは、まずブルーム フィルターにキーが存在するかどうかを確認し、存在する場合は実行を続行します。存在しない場合は直接返されます。ブルームフィルターは値を複数のハッシュビットに格納するため、ブルームフィルターが特定の要素が存在すると判断した場合、それを誤って判断する可能性があります。ブルーム フィルターが要素が存在しないと判断した場合、その要素は存在しないはずです。
効率を確保するために、Redis はデータをメモリにキャッシュしますが、データは定期的に更新されます。または、追加されたレコード ファイルに変更操作を書き込んで、データの永続性を確保します。 Redis には 2 つの永続化戦略があります。
RDB: スナップショット形式は、メモリ内のデータをダンプ ファイルに直接保存し、定期的に保存し、戦略を保存します。 Redis を永続化する必要がある場合、Redis は子プロセスをフォークし、子プロセスはディスク上の一時 RDB ファイルにデータを書き込みます。子プロセスが一時ファイルの書き込みを完了したら、元の RDB を置き換えます。
AOF: Redis サーバーを変更するすべてのコマンドを、コマンドのコレクションであるファイルに保存します。
永続化には AOF を使用します。各書き込みコマンドは、書き込み関数を通じて appendonly.aof に追加されます。 aof のデフォルトポリシーは 1 秒に 1 回 fsync することになっており、この構成では障害が発生しても最大 1 秒間はデータが失われます。欠点は、同じデータセットの場合、通常、AOF のファイル サイズが RDB ファイルのサイズよりも大きいことです。使用される fsync 戦略によっては、AOF が RDB よりも遅くなる場合があります。 Redis はデフォルトでスナップショット RDB の永続化方式を使用します。マスタとスレーブの同期は、マスタとスレーブが接続されたばかりの場合は完全同期(RDB)が実行され、完全同期が完了するとインクリメンタル同期(AOF)が実行されます。
Redis トランザクションの本質は一連のコマンドです。トランザクションは一度に複数のコマンドの実行をサポートしており、トランザクション内のすべてのコマンドはシリアル化されます。トランザクション実行処理中、キュー内のコマンドは順番に実行され、他のクライアントから送信されたコマンド要求はトランザクション実行コマンドシーケンスに挿入されません。要約すると、redis トランザクションは、キュー内の一連のコマンドを 1 回限り、順次、排他的に実行します。
Redis トランザクションには分離レベルの概念がありません。バッチ操作は、EXEC コマンドを送信する前にキュー キャッシュに入れられ、実際には実行されません。トランザクション内にクエリはありません。トランザクション内の更新は、トランザクション外のクエリでは参照できません。
Redis では、単一のコマンドがアトミックに実行されますが、トランザクションはアトミックであることが保証されず、ロールバックはありません。トランザクション内のいずれかのコマンドが実行に失敗した場合でも、残りのコマンドは引き続き実行されます。
watch key1 key2... : 1 つ以上のキーを監視します。トランザクションが実行されると、監視対象のキーが他のコマンドによって変更されると、トランザクションは中断されます (オプティミスティック ロックと同様)
#multi: トランザクション ブロックの開始をマークします (キューに入れられます)。
exec: すべてのトランザクション ブロックのコマンドを実行します (exec が実行されると、以前に追加された監視ロックはキャンセルされます)
Redis の再ハッシュ
この種のプログレッシブなリハッシュは、集中型のリハッシュによって引き起こされる膨大な量の計算とメモリ操作を回避しますが、redis がリハッシュされる場合、通常のアクセス リクエストはハッシュテーブルに 2 回アクセスする必要がある場合があることに注意してください ( ht[0], ht [1])、たとえば、キー値を新しい ht1 に再ハッシュする場合、最初に ht0 にアクセスする必要があります。ht0 で見つからない場合は、ht1 で見つかります。
ハッシュ テーブルに保存されるキーの数がハッシュ テーブルのサイズを超えています。
Redis サーバーは現在 BGSAVE コマンド (rdb) または BGREWRITEAOF コマンドを実行しておらず、ハッシュ テーブルの負荷係数は 1 以上です。
Redis サーバー BGSAVE コマンド (rdb) または BGREWRITEAOF コマンドが実行中であり、ハッシュ テーブルの負荷率が 5 以上です。 (負荷率 = 保存されたノード数)ハッシュ テーブル / ハッシュ テーブルのサイズで、ハッシュ テーブルの負荷率が 0.1 未満の場合、ハッシュ テーブルに対して縮小操作を実行します。)
分散ロック タイムスタンプ
メッセージ キューの使用
シングルスレッド ブロッキング Redis の場合、パイプラインはバッチ操作に対応し、複数のコマンドを Redis サーバーに継続的に送信し、応答結果を 1 つずつ解析できます。パイプライン化によりバッチ処理のパフォーマンスが向上します。向上の主な理由は、TCP 接続における「対話の往復」時間が短縮されることです。パイプラインの最下層はすべての操作をストリームにカプセル化し、redis は独自の受信および送信出力ストリームを定義します。 sync() メソッドで操作を実行します。各リクエストはキューに入れられ、応答パケットが解析されます。
最初にデータベースを更新してから、キャッシュを削除します。データベースの読み取り操作は書き込み操作よりもはるかに高速であるため、ダーティ データが発生しにくくなります。非同期遅延削除戦略を実装して、読み取りリクエストが完了した後に削除操作が確実に実行されるようにすることができます。
プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !
以上がRedis の面接で知っておくべき 20 個以上の質問をまとめました。ぜひ集めてください。 !の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。