Redisに関するよくある質問30選をまとめました!

リリース: 2022-01-14 09:05:53
転載
3503 人が閲覧しました

1.Redis はメモリの最適化をどのように実行しますか?

ハッシュ テーブル (ハッシュ) をできるだけ使用します。ハッシュ テーブル (ハッシュ テーブルに格納される数値が小さいことを意味します) は非常に少量のメモリを使用するため、データ モデルを可能な限り抽象化する必要があります。ハッシュテーブル内で可能。

たとえば、Web システムにユーザー オブジェクトがある場合は、ユーザーの名前、姓、電子メール、パスワードに個別のキーを設定せず、すべてのユーザー情報をハッシュに保存する必要があります。テーブル。 。

2. Redis でのパイプラインの用途は何ですか?

リクエスト/レスポンス サーバーは、古いリクエストがまだ応答されていない場合でも、新しいリクエストを処理できます。これにより、応答を待たずに複数のコマンドをサーバーに送信し、最終的に 1 ステップで応答を読み取ることができます。

これはパイプライン処理であり、数十年にわたって広く使用されてきた技術です。たとえば、多くの POP3 プロトコルはこの機能のサポートを実装しており、サーバーから新しい電子メールをダウンロードするプロセスが大幅に高速化されます。

3. Redis と Redisson の関係は何ですか?

Redisson は、ユーザーが分散環境、ConcurrentMap、List で一部の Java オブジェクト (ブルーム フィルター、BitSet、Set、SetMultimap、ScoredSortedSet、SortedSet、Map) を簡単に実装できるようにする高度な分散調整 Redis クライアントです。 、ListMultimap、Queue、BlockingQueue、Deque、BlockingDeque、セマフォ、Lock、ReadWriteLock、AtomicLong、CountDownLatch、パブリッシュ/サブスクライブ、HyperLogLog)。

4.Redis に適したシナリオは何ですか?

(1) セッション キャッシュ

Redis を使用するために最も一般的に使用されるシナリオの 1 つは、セッション キャッシュです。 Redis を使用して他のストレージ (Memcached など) 上でセッションをキャッシュする利点は、Redis が永続性を提供することです。一貫性を厳密に必要としないキャッシュを維持する場合、ユーザーのショッピング カート情報がすべて失われると、ほとんどの人は不満を抱くでしょう。

幸いなことに、Redis は長年にわたって改良されてきたため、Redis を適切に使用してセッション ドキュメントをキャッシュする方法を見つけるのは簡単です。有名な商用プラットフォーム Magento でも Redis プラグインが提供されています。

(2) フル ページ キャッシュ (FPC)

基本的なセッション トークンに加えて、Redis は非常にシンプルな FPC プラットフォームも提供します。一貫性の問題に戻りますが、Redis インスタンスが再起動されても、ユーザーはディスクの永続性によりページの読み込み速度が低下することはありません。これは、PHP ローカル FPC と同様に、大きな改善です。

Magento を例としてもう一度取り上げます。Magento は、Redis をフルページ キャッシュ バックエンドとして使用するためのプラグインを提供します。

さらに、WordPress ユーザー向けに、Pantheon には非常に優れたプラグイン wp-redis があり、閲覧したページをできるだけ早く読み込むのに役立ちます。

(3) キュー

メモリ ストレージ エンジンの分野における Redis の大きな利点の 1 つは、リスト操作とセット操作を提供し、これにより Redis を優れたメッセージ キューとして使用できることです。プラットホーム。 Redis によってキューとして使用される操作は、ローカル プログラミング言語 (Python など) のリストのプッシュ/ポップ操作に似ています。

Google で「Redis キュー」をすぐに検索すると、すぐに多数のオープンソース プロジェクトが見つかります。これらのプロジェクトの目的は、Redis を使用して、さまざまなキューに対応する非常に優れたバックエンド ツールを作成することです。ニーズがあります。たとえば、Celery には Redis をブローカーとして使用するバックエンドがあり、ここから確認できます。

(4) ランキング/カウンター

Redis は、メモリ内の数値を増減する操作を非常に適切に実装しています。 Sets と Sorted Sets を使用すると、これらの操作を非常に簡単に実行できます。Redis が提供するのは、これら 2 つのデータ構造だけです。

したがって、ソートされたセットから上位 10 人のユーザーを取得したいと考えています。それらを「user_scores」と呼びます。次のように実行するだけです。もちろん、これは昇順でソートしていることを前提としています。ユーザーのスコアに基づいて。ユーザーとユーザーのスコアを返したい場合は、次のように実行する必要があります:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games は Ruby で実装された良い例です。ランキングリスト データの保存には Redis を使用しています。ここで確認できます。

(5) パブリッシュ/サブスクライブ

最後 (重要なことですが) は、Redis のパブリッシュ/サブスクライブ機能です。パブリッシュ/サブスクライブには実際に多くの使用例があります。人々がこれをソーシャル ネットワーク接続で使用したり、パブリッシュ/サブスクライブ ベースのスクリプトのトリガーとして使用したり、Redis のパブリッシュ/サブスクライブ機能を使用してチャット システムを構築したりしているのを見てきました。

5. MySQL には 2,000 万のデータがありますが、redis には 2,000 万のデータのみが保存されます。redis 内のデータがホット データであることを確認するにはどうすればよいですか?

redis メモリ データ セットのサイズが特定のサイズに増加すると、データ削除戦略が実装されます。

実際、多くの企業は、面接中に Redis を調べるだけでなく、高同時実行性と高可用性のテクノロジを非常に重視しています。特に第一線のインターネット企業、分散型、

JVM、春ソースコード分析、マイクロサービス、その他の知識 ポイントはすでに面接で必ず答えなければならない質問です。

6. Redis クラスター ソリューションによってクラスター全体が使用できなくなるのは、どのような状況ですか?

3 つのノード A、B、および C があり、レプリケーション モデルがないクラスターでは、ノード B に障害が発生すると、クラスター全体が 5501 ~ 11000 の範囲のスロットが不足していると判断し、使用できなくなります。

7. Redis クラスター ソリューションでは何をすべきですか?計画は何ですか?

codis

現在最も一般的に使用されているクラスター ソリューションは、基本的に twemproxy と同じ効果がありますが、ノードの数が増えた場合に古いノード データを新しいハッシュ ノードに復元することをサポートします。変化します。

redis クラスター

3.0 に付属するクラスターは、分散アルゴリズムが一貫性のあるハッシュではなく、ハッシュ スロットの概念を採用していることと、ノード設定のスレーブ ノードをサポートしていることが特徴です。詳細については公式ドキュメントを参照してください。ビジネス コード レイヤーで実装されると、関連性のない複数の Redis インスタンスが作成され、コード レイヤーでキーのハッシュ計算が実行され、対応する Redis インスタンスを使用してデータが操作されます。この方法には、ハッシュ レイヤー コードに対する比較的高い要件があり、考慮事項には、ノード障害後の代替アルゴリズム ソリューション、データ ショック後の自動スクリプト回復、インスタンスの監視などが含まれます。

8.Redis 文字列の内部エンコーディングは何ですか?

int、embstr、raw

10000 未満の整数は、キャッシュ内の int 定数を使用します。

長さは 44 バイト以下: embstr エンコーディング

長さが 44 バイトを超える: raw エンコーディング

9. Redis を遅延キューとして使用する方法? 成し遂げる?

Zset を使用して実装できます。 member はタスクの説明、score は実行時間で、タイマーを使用して定期的にスキャンし、実行時間が現在時刻以下のタスクがあればすぐに実行されます。

10. クラスター内でキーを検索するときに、Redis はどのようにして特定のノードを見つけますか?

crc16 アルゴリズムを使用してキーをハッシュし、16384 を法とするハッシュ値を取得し、ノードとスロットのマッピング情報に基づいて特定のスロットを取得します (クラスターとの接続を確立した後、クライアントはスロット マッピング情報を取得できます)、特定のノード アドレスを見つけて、特定のノードに移動してキーを見つけます。キーがこのノード上にない場合、Redis クラスターは移動されたコマンドを返し、新しいノード アドレスを同時に、クライアントはローカル ノード スロットを更新します ビット マッピング関係 スロットが移行中の場合、Redis クラスターは要求コマンドをクライアントに返します これは一時的な修正です クライアントは更新されませんローカル ノード スロット マッピング関係

11.Redis 永続性について理解したことがありますか?

Redis の永続化には、RDB と AOF の 2 つの方法があります。

RDB: データベースのスナップショットをバイナリ形式でディスクに保存します。

AOF: データベースに書き込まれるすべてのコマンドとパラメータをプロトコル テキストの形式で AOF ファイルに記録し、それによってデータベースのステータスを記録します。

12. Redis はどのような状況でキーのリサイクルをトリガーしますか?

2 つの状況: 1. 定期的な (サンプリング) クリーニング; 2. コマンドの実行時に、メモリが maxmemory を超えているかどうかを確認します。

13.Redis キーの削除戦略は何ですか?

8 種: noeviction、volatile-lru、volatile-lfu、volatile-ttl、volatile-random、allkeylru、allkeys-lfu、allkeys-random

14。 Redisのトランザクションの仕組みは理解できましたか?

Redis トランザクションの概念:

Redis トランザクションの本質は一連のコマンドです。トランザクションは一度に複数のコマンドの実行をサポートしており、トランザクション内のすべてのコマンドはシリアル化されます。トランザクション実行処理中、キュー内のコマンドは順番に実行され、他のクライアントから送信されたコマンド要求はトランザクション実行コマンドシーケンスに挿入されません。

Redis トランザクションは、キュー内の一連のコマンドを 1 回限り、順次かつ排他的に実行します。

Redis トランザクションには分離レベルの概念がありません:

バッチ操作は、EXEC コマンドを送信する前にキュー キャッシュに入れられ、実際には実行されないため、トランザクション内にクエリはありません。トランザクション内の更新は、トランザクション外のクエリでは確認できません。

Redis はアトミック性を保証しません:

Redis では、単一のコマンドはアトミックに実行されますが、トランザクションはアトミック性を保証せず、ロールバックはありません。トランザクション内のいずれかのコマンドが実行に失敗した場合でも、残りのコマンドは引き続き実行されます。

Redis トランザクションの 3 つの段階:

トランザクションの開始

コマンドのエンキュー

トランザクションの実行

Redis トランザクション関連のコマンド:

watch key1 key2 ...: 1 つ以上のキーを監視します。トランザクションの実行前に監視対象のキーが他のコマンドによって変更された場合、トランザクションは中断されます (楽観的ロックと同様)

multi:トランザクション ブロックの開始をマークします (キューに入れられています)

exec: すべてのトランザクション ブロックのコマンドを実行します (exec が実行されると、以前に追加された監視ロックはキャンセルされます)

discard: トランザクションをキャンセルします、トランザクション ブロック内のすべてのコマンドを放棄します

unwatch: すべてのキーのウォッチの監視をキャンセルします

15. Redis を使用して Web サイトの UV をカウントするにはどうすればよいですか?

UV は PV とは異なり、UV は重複排除する必要があります。通常、解決策は 2 つあります:

1. BitMap を使用します。保存されるのはユーザーの uid で、UV を計算するときはビットカウントを行うだけです。

2. ブルームフィルターを使用します。各訪問のユーザー ID をブルーム フィルターに入力します。メリットはメモリを節約できることですが、デメリットは正確なUVが得られないことです。ただし、特定の UV を正確に知る必要がなく、大まかな大きさだけが必要なシーンには適しています。

16. Redis で大きなキーを扱うにはどうすればよいですか?

ビッグキーとは、特に大きな値を持つキーを指します。たとえば、非常に長い文字列や大規模なセットなどです。キーが大きいと、次の 2 つの問題が発生します:

1. データ スキュー (たとえば、一部のノードのメモリ使用量が高すぎる)。

2. 大きなキーが削除されるか、大きなキーが自動的に期限切れになると、Redis はシングルスレッドであるため、QPS が突然低下します。

解決策: 大きなキーは断片化される可能性があります。たとえば、大きなセットが複数の小さなセットに分割される可能性があります。

17. Redis でホット キーを扱うにはどうすればよいですか?

1. ホットキーを配布します。たとえば、キーに異なるサフィックスを追加し、複数のキーをキャッシュして、各キーが異なるノードに分散されるようにします。

2. マルチレベル キャッシュを使用します。

18. キャッシュの無効化?キャッシュの侵入?キャッシュ雪崩?キャッシュの同時実行性?

キャッシュの無効化 キャッシュの無効化とは、多数のキャッシュが同時に失敗し、DB に対する瞬間的な負荷が高まることを意味します。この現象は、キーの有効期限が同じ値に設定されていることが原因です。解決策は、キーの有効期限に 5 分やランダムな秒などのランダムな要素を導入することです。

キャッシュ ペネトレーション キャッシュ ペネトレーションとは、データベースにもキャッシュにも存在しないデータをクエリすることを指します。データベースは常にクエリされるため、データベースへのアクセス圧力が増加します。キャッシュ ペネトレーションのソリューションタイプ 2: 空のオブジェクトをキャッシュする: コードのメンテナンスは簡単になりますが、効果は良くありません。ブルーム フィルター: コードの保守は複雑ですが、効果は非常に優れています。

キャッシュなだれ キャッシュなだれとは、一定期間内に集中的にキャッシュが期限切れになることを指します。現時点では、無数のリクエストがキャッシュを直接バイパスし、データベースを直接リクエストしています。キャッシュなだれが発生する理由は 2 つあります。1 つは REID のダウンタイムです。データの大部分は無効です。

キャッシュ雪崩には 2 つの解決策があります。

高可用性クラスターを構築して、スタンドアロン Redis がダウンするのを防ぎます。

契約期間内に多数のキーが無効になるのを防ぐために、異なる有効期限を設定します。

キャッシュの同時アクセス Web サイトの同時アクセスが多い場合、キャッシュが失敗すると、複数のプロセスが同時に DB にクエリを実行し、同時にキャッシュをセットアップすることがあります。同時実行が非常に大きい場合、これはまた、DB に過度の負荷がかかる可能性や、キャッシュの更新が頻繁に発生するという問題もあります。一般的な解決策は、DB をチェックするときにロックすることです。KEY が存在しない場合はロックし、DB をキャッシュにチェックインしてからロックを解除します。他のプロセスがロックがあることを検出した場合は、待機してから待機します。キャッシュを確認したり、DB に入る前にロックが解除されます。

19. Redis クラスター用のデータベースを選択するにはどうすればよいですか?

Redis クラスターは現在データベースを選択できず、デフォルトはデータベース 0 です。

20.Redis でパスワードを設定し、パスワードを確認するにはどうすればよいですか?

パスワードの設定: config set requirepass 123456

認可パスワード: auth 123456

21. Redis がすべてのデータをメモリに配置する必要があるのはなぜですか?

最速の読み取りおよび書き込み速度を実現するために、Redis はすべてのデータをメモリに読み取り、そのデータを非同期でディスクに書き込みます。

つまり、redis は高速でデータの永続性が高いという特徴があるため、データがメモリに配置されていない場合、ディスク I/O 速度が redis のパフォーマンスに深刻な影響を及ぼします。

今日、メモリがますます安価になるにつれて、redis はますます普及するでしょう。最大メモリ使用量が設定されている場合、既存のデータ レコードの数がメモリ制限に達すると、新しい値を挿入できなくなります。

22.なぜ Redis は Windows バージョンを正式に提供しないのですか?

現在の Linux バージョンは非常に安定しており、ユーザー数も多いため、互換性やその他の問題が発生する Windows バージョンを開発する必要はありません。

23. Redis はシングルスレッドですか、それともマルチスレッドですか?

Redis6.0 はマルチスレッド IO を使用しますが、コマンドの実行は依然としてシングルスレッドです。

Redis 6.0 より前は、IO スレッドと実行スレッドは両方ともシングルスレッドでした。

24. Redis はなぜそれほど速いのでしょうか?

1. メモリ操作;

2. シングルスレッド、スレッド切り替えとロック競合のオーバーヘッドを排除;

3. ノンブロッキング IO モデル、epoll 。

25. 文字列型の値が格納できる最大容量はどれくらいですか?

512M

26. Redis の正式名は何ですか?

リモート辞書サーバー。

27.Redis は主にどのような物理リソースを消費しますか? #########メモリ。

28.Redis にはどのようなデータ構造がありますか?

Redis には、string (文字列)、list (リスト)、hash (辞書)、set (セット)、および zset (順序付きセット) という 5 つの基本的なデータ構造があります。

これらの 5 つのタイプは、Redis 関連の知識の最も基本的かつ重要な部分です。

29.memcached と比較した Redis の利点は何ですか?

(1) memcached のすべての値は単純な文字列であり、redis はその代替として、より豊富なデータ型をサポートします

(2) Redis は memcached よりも高速です はるかに高速です

(3) redis はデータを永続化できます

30. Redis とは何ですか?その利点と欠点を簡単に説明してください。

Redis は、基本的に、memcached と同様に、Key-Value タイプのメモリ内データベースです。データベース全体がメモリ内でロードおよび操作され、データベース データは、次の非同期操作を通じてハードディスクにフラッシュされます。一定の間隔で保管してください。

これは純粋なメモリ操作であるため、Redis のパフォーマンスは非常に優れており、1 秒あたり 100,000 を超える読み取りおよび書き込み操作を処理でき、既知のパフォーマンスで最速の Key-Value DB です。

Redis の優秀さはパフォーマンスだけではありません。Redis の最大の魅力は、さまざまなデータ構造の保存に対応していることです。また、単一の値の最大制限は 1GB です。1MB しか保存できない memcached とは異なります。 Redis を使用すると、多くの便利な機能を実現できます。

たとえば、彼のリストを使用して FIFO 二重リンク リストを作成し、軽量で高性能のメッセージ キュー サービスを実装したり、彼のセットを使用して高性能のタグ システムを作成したりできます。

さらに、Redis は保存された Key-Value の有効期限を設定できるため、memcached の拡張バージョンとしても使用できます。 Redis の主な欠点は、データベース容量が物理メモリによって制限され、大量のデータの高パフォーマンスな読み取りおよび書き込みには使用できないことです。そのため、Redis に適したシナリオは主に高パフォーマンスの操作と少量の計算に限定されます。データの。

推奨される学習: 「redis ビデオ チュートリアル

以上がRedisに関するよくある質問30選をまとめました!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:码农有道
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート