この記事では、Redis キャッシュに関する面接での質問をいくつか紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
redis キャッシュのインタビューの質問
1. redis と memcached の違いは何ですか?同時実行性が高い場合、シングルスレッド Redis がマルチスレッド memcached よりも効率的になる場合があるのはなぜですか?
違い:
##3.redis はメッセージ キューとして使用できます。
理由: memcached マルチスレッド モデルではキャッシュの一貫性とロックが導入されており、ロックによってパフォーマンスが低下します。
2. Redis のマスター/スレーブ レプリケーションはどのように実装されますか? Redis クラスター モードを実装するにはどうすればよいですか? Redis のキーはどのように扱われますか?
マスター/スレーブ レプリケーションの実装: マスター ノードは自身のメモリ内のデータのスナップショットを取得し、そのスナップショットをスレーブ ノードに送信し、スレーブ ノードはデータをメモリに復元します。その後、新しいデータが追加されるたびに、マスター ノードは mysql と同様のバイナリ ログ形式でステートメントをスレーブ ノードに送信し、スレーブ ノードはマスター ノードによって送信されたステートメントを取得して再生します。
シャーディング方法:
- クライアント側シャーディング
- プロキシベースのシャーディング
#Twemproxy codis ルーティング クエリ シャーディング Redis-cluster 本体が提供するものデータを RedisCluster のさまざまなノードに自動的に分散する機能。データ コレクション全体の特定のデータ サブセットがどのノードに保存されるかは、ユーザーには透過的です) redis- クラスターの断片化の原則:クラスタ内の 16384 長のスロット (仮想スロット) であり、0 ~ 16383 の番号が付けられます。各マスターノードはスロットの一部を担当し、マスターが担当するスロットに特定のキーがマッピングされている場合、マスターはそのキーに対するサービスを提供する責任を負います。スロットはユーザーが指定できます。または、初期化中に自動的に生成され、マスターのみがスロットの所有権を持ちます。マスター ノードは 16384/8 バイトのビット シーケンスを維持し、ビットを使用して特定のスロットを所有しているかどうかを識別します。たとえば、スロット番号が 1 の場合、マスターはシーケンスの 2 番目のビット (0 から始まるインデックス) が 1 であるかどうかを判断するだけで済みます。この構造により、ノードの追加または削除が簡単になります。たとえば、新しいノード D を追加する場合、ノード A、B、C から D にいくつかのスロットを取得する必要があります。 [関連する推奨事項:
Redis ビデオ チュートリアル
]
3. Redis を使用して分散ロックを設計するにはどうすればよいですか?導入のアイデアについて教えてください。 zkは使えますか?どうやって達成するのか?これら 2 つの違いは何ですか?
redis:
スレッド Asetnx (ロックされたオブジェクトがタイムアウトしたときのタイムスタンプ tl)、true が返された場合、ロックが取得されています。 スレッド B は get を使用して t1 を取得し、現在のタイムスタンプと比較し、タイムアウトしたかどうかを判断します。タイムアウトしていない場合は false です。タイムアウトした場合は、手順 3 を実行します。 ; -
新しいタイムアウト t2 を計算し、getset コマンドを使用して t3 を返します (この値は他のスレッドによって変更されている可能性があります)、t1==t3 の場合、ロックを取得します (t1 の場合) !=t3、ロックは他のスレッドによって取得されました。 ロック取得後、ビジネスロジックを処理し、ロックがタイムアウトしたかどうかを判定し、タイムアウトしていない場合はロックを削除し、タイムアウトしている場合はロックを削除します。処理する必要はありません (他のスレッドのロックが削除されるのを防ぐため)。 zk:
クライアントがメソッドをロックすると、そのメソッドは zk 上のメソッドに対応する指定されたノードのディレクトリにあり、生成されます。一意の瞬時順序付けノードnode1; クライアントは、パス配下に作成された子ノードをすべて取得し、自身が作成したnode1のシリアル番号が最小であることが判明した場合、このクライアントはロックを取得しました。 node1 が最小ではないことが判明した場合は、作成したノードよりも小さいシリアル番号を持つ最大のノードをリッスンして待機します。 ロックを取得したら、ロジックの処理を終了し、作成したノード 1 を削除します。違い: zk のパフォーマンスは悪く、オーバーヘッドは高く、実装は単純です。
#4. Redis の永続化についてご存知ですか?最下層はどのように実装されているのでしょうか?メリットとデメリットは何ですか?
RDB (RedisDataBase: Redis データによって生成されたスナップショットをさまざまな時点でディスクや他のメディアに同期します): メモリからハードディスクへのスナップショット。定期的に更新されます。欠点: 時間がかかり、パフォーマンスが消費され (フォーク IO 操作)、データが失われやすい。
AOF (AppendOnlyFile: redis によって実行されたすべての命令を記録します。次回 redis を再起動するときは、命令を実行するだけで済みます): ログを書き込みます。欠点:サイズが大きく、回復速度が遅い。
bgsave は完全なイメージ永続性を実行し、aof は増分永続性を実行します。 bgsave には時間がかかり、リアルタイム性が十分ではないため、シャットダウン中に大量のデータ損失が発生し、aof が連携する必要があります。redis インスタンスが再起動されると、メモリ状態を復元するために最初に aof が使用されます。 aof ログがない場合は、rdb ファイルを使用して復元します。 Redis は定期的に AOF を書き換えて、AOF ファイルのログ サイズを圧縮します。 Redis 4.0 以降では、bgsave の全量と aof の増分を統合するハイブリッド永続化機能が追加され、リカバリの効率を確保するだけでなく、データのセキュリティも考慮されます。 bgsave、fork、cow の原理では、fork は redis が子プロセスを作成して bgsave 操作を実行することを意味し、cow は copyonwrite を意味します。子プロセスが作成された後、親プロセスと子プロセスはデータ セグメントを共有し、親プロセスは継続して実行されます。読み取りおよび書き込みサービスを提供し、ダーティ ページを書き込みます。データは子プロセスから徐々に分離されます。
5. Redis の有効期限戦略は何ですか? LRUアルゴリズムをご存知ですか?それを実装するための Java コードを記述しますか?
有効期限戦略:
スケジュールされた有効期限 (1 つのキーにはタイマーが付いています)、遅延有効期限: キーが使用された場合にのみ、キーの有効期限が切れているかどうかが判断され、有効期限が切れます。有効期限が切れるとクリアされます。定期的な有効期限: 最初の 2 つの妥協点。
LRU: newLinkedHashMap(capacity,DEFAULT_LOAD_FACTORY,true); 3 番目のパラメーターは true に設定され、リンクリストがアクセス順にソートされ、LRU キャッシュとして使用できることを意味します。 false に設定すると、挿入順で並べ替えられます。FIFO キャッシュとして使用できます
#LRU アルゴリズムの実装:
- 双方向で実装されます。リンク リストの場合、新しいデータはリンク リストの先頭に挿入されます。
- キャッシュがヒットする (つまり、キャッシュされたデータがアクセスされる) たびに、データはリンク リストの先頭に移動されます。リンク リスト;
- リンク リストがいっぱいになると、リンク リストの最後にあるデータは破棄されます。
LinkedHashMap: HashMap と二重リンク リストを組み合わせたものが LinkedHashMap です。 HashMap は順序付けされておらず、LinkedHashMap は追加の二重リンク リストを維持することで反復順序を保証します。反復順序は、挿入順序 (デフォルト) またはアクセス順序です。
6. キャッシュの侵入、キャッシュの破壊、キャッシュなだれの解決策?
** キャッシュの侵入: ** は、存在してはいけないデータのクエリを指します。データがストレージ層から見つからない場合、データはキャッシュに書き込まれません。これにより、存在しないデータはすべてクエリのために DB に送信される必要があるため、DB がハングする可能性があります。
解決策:
- クエリによって返されたデータは空であり、空の結果は引き続きキャッシュされますが、有効期限は短くなります;
- ブルーム フィルター: 考えられるすべてのデータを十分な大きさのビットマップにハッシュし、存在してはいけないデータはこのビットマップによってインターセプトされるため、DB クエリが回避されます。
**キャッシュの内訳: **有効期限が設定されたキーの場合、キャッシュが特定の時点で期限切れになると、偶然にも多数の同時リクエストが発生します。以前は、これらのリクエストでキャッシュの有効期限が切れていることが判明すると、通常はバックエンド DB からデータをロードしてキャッシュにリセットしていましたが、このとき、大量の同時リクエストにより瞬時に圧倒される可能性があります。 DB。
解決策:
- ミューテックス ロックを使用する: キャッシュが失敗した場合、すぐに Ioaddb にアクセスせず、まず Redis などの setnx を使用してミューテックス ロックを設定します。操作が正常に返された場合は、Ioaddb 操作を実行してキャッシュを復元します。それ以外の場合は、キャッシュ取得メソッドを再試行します。
- 無期限: 物理的な期限はありませんが、ロジックの期限は切れます (バックグラウンドの非同期スレッドが更新されます)。キャッシュ雪崩: キャッシュの設定時に同じ有効期限が使用されるため、特定の瞬間にキャッシュが同時に期限切れになり、すべてのリクエストが DB に転送され、DB に瞬間的な圧力がかかり、雪崩が発生します。キャッシュ ブレークダウンとの違い: アバランチは多数のキーであり、ブレークダウンは特定のキー キャッシュです。
解決策:
キャッシュの有効期限を分散します。たとえば、元の有効期限にランダムな値 (1 ~ 5 分など) を追加できます。各キャッシュの有効期限の繰り返し率が減少し、集団的な障害イベントが発生しにくくなります。
#7. キャッシュを選択する場合、redis を選択する場合、および memcached を選択する場合
redis を選択する場合の状況:
# #複雑なデータ構造。この場合、値のデータはハッシュ、リスト、セット、順序付きセットなどです。memcache ではこれらのデータ構造を満たすことができないため、redis が選択されます。最も典型的な使用シナリオは、ユーザー順序リスト、ユーザー メッセージ、コメントなどを投稿する
-
データを永続化する必要がありますが、redis をデータベースとして使用しないように注意してください。redis がハングした場合でも、メモリはホット データをすぐに復元できるため、データベースに即座に負荷をかけることはありません。 、キャッシュのウォームアッププロセスはありません。読み取り専用およびデータ整合性の要件が高くないシナリオでは、永続ストレージを使用して高可用性を実現できます。Redis はクラスターをサポートし、アクティブ レプリケーションと読み取り/書き込み分離を実現できます。 memcache (必要な場合) 高可用性を実現するには、二次開発が必要です。
-
格納されるコンテンツは比較的大きく、memcache に格納される最大値は 1M です。
-
memcache を選択するシナリオ:
- 純粋な KV、非常に大量のデータを扱うビジネスには、次の理由により memcache の方が適しています:
memcache のメモリ割り当ては、メモリ割り当て時間を節約できる事前割り当てメモリ プールの管理方法を採用していますが、Redis は一時的なアプリケーション領域であるため、断片化が発生する可能性があります。
仮想メモリを使用して、memcache はすべてのデータを物理メモリに保存します。Redis には独自の vm メカニズムがあり、理論的には物理メモリよりも多くのデータを保存できます。データが超過したとき、スワップは行われます。
- #ネットワーク モデル、memcache はノンブロッキング 10 再利用モデルを使用します。 、redis もノンブロッキング I を使用します。モデルを再利用しますが、redis は KV ストレージ以外のいくつかの並べ替え、集計関数、および複雑な CPU 計算も提供します。これにより、I0 スケジューリング全体がブロックされます。この観点から見ると、redis はより多くの機能を提供するため、memcache の方が高速です
- スレッド モデル、memcache はマルチスレッドを使用し、メイン スレッドがリッスンし、ワーカー サブスレッドがリクエストを受け入れ、読み取りと書き込みを実行します。このプロセスではロックの競合が発生する可能性があります。 Redis が使用するシングルスレッドではロックの競合はありませんが、マルチコアの特性を利用してスループットを向上させるのは困難です。
#8. キャッシュがデータベースと一致しない場合はどうすればよいですか?
メインメモリを分離し、読み書き分離データベースを使用すると仮定すると、 スレッド A がキャッシュされたデータを削除してからメインライブラリにデータを書き込むと、この時点でこの時点では、メイン ライブラリとスレーブ ライブラリの同期が完了していません。スレッド B はキャッシュからのデータの読み取りに失敗しました。スレーブ ライブラリから古いデータを読み取り、キャッシュに更新します。この時点で、キャッシュには古いデータが含まれていますデータ。
上記の不整合は主従データベースのデータの不整合が原因であり、キャッシュ追加後は主従不整合時間が長くなります。 処理の考え方: データベースからデータが更新されると、キャッシュ内のデータも同時に更新されます。つまり、データベースからデータが更新されると、キャッシュからデータを削除し、この期間中に書き込まれた古いデータは削除されます。
9. マスター データベースとスレーブ データベース間の不一致を解決するにはどうすればよいですか?
シナリオの説明: マスターとスレーブのデータベースでは、読み取りと書き込みが分離されているため、マスターとスレーブのデータベースの更新同期に時間差があると、マスターとスレーブの間で不整合が発生します。データベース データ
- このデータの不一致を無視してください。データの一貫性要件が低いビジネスでは、時間ごとの一貫性は必要ない場合があります。
- メイン ライブラリからの読み取りを強制し、可用性の高いメイン ライブラリを使用し、データベースの読み取りと書き込みをすべてメイン ライブラリで行い、キャッシュを追加してデータ読み取りのパフォーマンスを向上させます。
- メイン ライブラリを選択的に読み取り、メイン ライブラリから読み取る必要があるデータを記録するキャッシュを追加し、どのライブラリ、どのテーブル、どの主キーをキャッシュ キーとして使用します。キャッシュ無効化を設定します 時間はマスターライブラリとスレーブライブラリ間の同期時間です キャッシュにこのデータがある場合はマスターライブラリを直接読み込みます キャッシュに主キーがない場合は対応するスレーブライブラリから読み込みます
10. Redis の一般的なパフォーマンスの問題と解決策
- マスターは RDB などの永続化作業を行わないのが最善ですメモリ スナップショットと AOF ログ ファイル
#データが重要な場合、スレーブは AOF バックアップを有効にし、ポリシーは 1 秒に 1 回同期するように設定されます マスター/スレーブ レプリケーションの速度と接続の安定性を考慮すると、マスターとスレーブがローカル エリア ネットワーク内にあることが最適です スレーブ ライブラリを追加しないようにしてくださいストレスのかかるマスター ライブラリへの接続
マスター/スレーブ レプリケーションにはメッシュ構造を使用せず、線形構造 (マスター<–スレーブ1<—スレーブ2...) を使用するようにしてください。
11. Redis データの削除戦略とは何ですか?
voltile-lru は、有効期限が設定されているデータセットから最も最近使用されていないデータを選択し、削除します。
voltile-ttl は有効期限が設定されたデータベースセットから使用するデータを選択します 期限切れデータ
voltile-random は有効期限が設定されたデータセットからデータを選択して削除します
allkeys-lru はデータ セットから最も最近使用されていないデータを選択して削除します
allkeys -random はデータ セットから削除されたデータをランダムに選択します
no-eviction は削除を禁止しますデータの
#12. Redisにはどのようなデータ構造がありますか
#String String、辞書Hash、リスト、セット、順序付きセットSortedSet。上級ユーザーの場合はさらに多くの項目がありますが、中級または上級の Redis ユーザーの場合は、HyperLogLog、Geo、および Pub/Sub のデータ構造も追加する必要があります。
13. Redis に 1 億個のキーがあり、100,000 個のキーが固定の既知のプレフィックスで始まると仮定します。
keys コマンドを使用して、指定したモードのキー リストをスキャンします。
次に、相手は「この Redis がオンライン ビジネスにサービスを提供している場合、keys コマンドの使用にはどのような問題がありますか?」と尋ねました。
現時点では、redis の重要な機能の 1 つである redis のシングル スレッドについて答える必要があります。キー命令によりスレッドが一定期間ブロックされ、オンライン サービスが一時停止されます。命令が実行されるまでサービスは復元できません。このとき、scan コマンドを使用できます。scan コマンドは、指定したモードのキーリストをブロックせずに抽出できますが、一定の確率で重複が発生します。クライアントで 1 回実行するだけですが、全体の所要時間は長くなります。直接使用するよりも長くなります。keys コマンドは長いです。
14. Redis を使用して非同期キューを作成したことがありますか?それはどのように実装されていますか?
リスト タイプを使用してデータ情報を保存し、rpush はメッセージを生成し、lpop はメッセージを消費しますlpop にメッセージがない場合は、一定時間スリープしてから情報があるかどうかを確認できます。スリープしたくない場合は、blpop を使用できます。情報がない場合は、情報があるまでブロックされます到着。 Redis は、Pub/Sub トピック サブスクリプション モデルを通じて 1 つのプロデューサーと複数のコンシューマーを実装できます。もちろん、いくつかの欠点があります。コンシューマーがオフラインになると、生成されたメッセージは失われます。
15. Redis で遅延キューを実装する方法
sortedset を使用し、タイムスタンプをスコアとして使用し、メッセージ コンテンツをキーとして使用し、zadd を呼び出してメッセージを生成し、コンシューマーは zrangbyscore を使用しますポーリング処理のためにn秒前のデータを取得します。
16. Redis とは何ですか?その利点と欠点を簡単に説明してください。
Redis は、基本的に、memcached と同様に、Key-Value タイプのメモリ内データベースです。データベース全体が操作のためにメモリにロードされ、データベース データは、ストレージのためにハードディスクにフラッシュされます。非同期操作を定期的に実行します。
これは純粋なメモリ操作であるため、Redis は優れたパフォーマンスを備え、1 秒あたり 100,000 を超える読み取りおよび書き込み操作を処理できます。これは、実行が知られている中で最も高速な Key-ValueDB です。
Redis の優秀さはパフォーマンスだけではありません。Redis の最大の魅力は、さまざまなデータ
構造の保存に対応していることです。また、memcached とは異なり、単一の値の最大制限は 1GB です。 1MB のデータしか保存できないため、Redis を使用して多くの便利な機能を実装できます。
たとえば、List を使用して FIFO 二重リンク リストを作成し、軽量で高性能なメッセージ キュー サービスを実装したり、その Set を使用して高性能タグ システムを作成したりすることができます。
さらに、Redis は保存された Key-Value の有効期限を設定できるため、memcached の拡張バージョンとしても使用できます。 Redis の主な欠点は、データベース容量が物理メモリによって制限され、大量のデータの高パフォーマンスな読み取りおよび書き込みには使用できないことです。そのため、Redis に適したシナリオは主に高パフォーマンスの操作と少量の計算に限定されます。データの。
17.memcached と比較した Redis の利点は何ですか?
18. Redis はどのようなデータ型をサポートしていますか?
String、List、Set、SortedSet、hashes
19. Redis は主にどのような物理リソースを消費しますか? #########メモリ。
20. Redis の正式名は何ですか?
Remote Dictionary Server
21. Redis にはどのようなデータ削除戦略がありますか?
noeviction: メモリ制限に達し、クライアントがより多くのメモリを使用するコマンドを実行しようとするとエラーを返します (ほとんどの書き込みコマンド、ただし DEL といくつかの例外)
allkeys-lru: 新しく追加されたデータ用のスペースを確保するために、最も使用されていないキー (LRU) をリサイクルしてみます。 volatile-lru: 最も使用されていないキー (LRU) のリサイクルを試みますが、新しく追加されたデータを保存する余地を残すため、有効期限が切れたセット内のキーのみをリサイクルします。 allkeys-random: 新しく追加されたデータを保存するためのスペースを確保するために、ランダム キーをリサイクルします。 volatile-random: ランダム キーをリサイクルして、新しく追加されたデータ用のスペースを確保しますが、有効期限が切れたセット内のキーのみを格納します。 volatile-ttl: 期限切れのセット内のキーをリサイクルし、生存時間 (TTL) が短いキーのリサイクルを優先して、新しく追加されたデータを保存するためのスペースを確保します。
22. Redis が Windows バージョンを正式に提供しないのはなぜですか?
現在の Linux バージョンは非常に安定しており、ユーザー数も多いため、互換性やその他の問題が発生する Windows バージョンを開発する必要はありません。
23. 文字列型の値が格納できる最大容量はどれくらいですか?
512M
24. Redis がすべてのデータをメモリに配置する必要があるのはなぜですか?
最速の読み取りおよび書き込み速度を実現するために、Redis はすべてのデータをメモリに読み取り、そのデータを非同期でディスクに書き込みます。
つまり、redis には高速さとデータの永続性という特徴があります。データがメモリに配置されていない場合、ディスク I/O 速度は Redis のパフォーマンスに重大な影響を与えます。 現在、メモリがますます安価になっているため、redis の人気はますます高まるでしょう。使用される最大メモリが設定されている場合、既存のデータ レコードの数がメモリ制限に達すると、新しい値を挿入できなくなります。
25. Redis クラスター ソリューションはどのように実装する必要がありますか?計画は何ですか?
コディス。 現在最も一般的に使用されているクラスター ソリューションは、基本的に twemproxy と同じ効果がありますが、ノード数が変わった場合に古いノード データを新しいハッシュ ノードに復元する機能をサポートしています。 -
rediscluster3.0に付属するクラスタは、分散アルゴリズムが整合性ハッシュではなくハッシュスロットの概念を採用していることと、スレーブノードからのノード設定を独自にサポートしていることが特徴です。詳細については公式ドキュメントを参照してください。
ビジネス コード レイヤーで実装され、関連性のない複数の Redis インスタンスを作成し、コード レイヤーでキーのハッシュ計算を実行し、対応する Redis インスタンスでデータを操作します。この方法にはハッシュ レイヤー コードに対する要件が比較的高く、ノード障害後の代替アルゴリズム ソリューション、データ ショック後の自動スクリプト回復、インスタンスの監視などが考慮されます。
#26. Redis クラスター ソリューションによってクラスター全体が使用できなくなるのは、どのような状況ですか?
3 つのノード A、B、C があり、レプリケーション モデルがないクラスターでは、ノード B に障害が発生すると、クラスター全体が 5501- の範囲のスロットが不足していると判断します。 11000。利用できません。
27. MySQL には 2,000 万のデータがありますが、redis には 2,000 万のデータのみが保存されます。redis 内のデータがホット データであることを確認するにはどうすればよいですか?
Redis メモリ データ セットのサイズが特定のサイズに増加すると、データ削除戦略が実装されます。
28. Redis に適したシナリオは何ですか?
-
セッション キャッシュ (SessionCache)
Redis を使用するために最も一般的に使用されるシナリオの 1 つは、セッション キャッシュ (sessioncache) です。 Redis を使用して他のストレージ (Memcached など) 上でセッションをキャッシュする利点は、Redis が永続性を提供することです。一貫性を厳密に必要としないキャッシュを維持する場合、ユーザーのショッピング カート情報がすべて失われると、ほとんどの人は不満を抱くでしょう。
幸いなことに、Redis は長年にわたって改良されてきたため、Redis を適切に使用してセッション ドキュメントをキャッシュする方法を見つけるのは簡単です。有名な商用プラットフォーム Magento でも Redis プラグインが提供されています。
- フル ページ キャッシュ (FPC)
基本的なセッション トークンに加えて、Redis は非常にシンプルな FPC プラットフォームも提供します。一貫性の問題に戻りますが、Redis インスタンスが再起動されても、ユーザーはディスクの永続性によりページの読み込み速度が低下することはありません。これは、PHP ローカル FPC と同様に、大きな改善です。 Magento を例に挙げます。Magento は、Redis をフルページ キャッシュ バックエンドとして使用するためのプラグインを提供します。
さらに、WordPress ユーザー向けに、Pantheon には非常に優れたプラグイン wp-redis があり、閲覧したページをできるだけ早く読み込むのに役立ちます。
- Queue
メモリ ストレージ エンジンの分野における Reid の大きな利点の 1 つは、Redis がリストおよびセット操作を提供し、これにより Redis を優れたメッセージ キュー プラットフォームとして使用できることです。 Redis によってキューとして使用される操作は、リストに対するローカル プログラミング言語 (Python など) のプッシュ/ポップ操作に似ています。 Google で「Redisqueues」をすばやく検索すると、すぐに多数のオープン ソース プロジェクトが見つかります。これらのプロジェクトの目的は、Redis を使用して、さまざまなキューのニーズを満たす非常に優れたバックエンド ツールを作成することです。たとえば、Celery には Redis をブローカーとして使用するバックエンドがあり、ここから確認できます。
ランクボード/カウンター
Redis は、メモリ内の数値を増減する操作を非常に適切に実装しています。セット (Set) と順序付きセット (SortedSet) を使用すると、これらの操作を非常に簡単に実行できます。Redis はこれら 2 つのデータ構造を提供するだけです。したがって、ソートされたセットから上位 10 人のユーザーを取得したいと考えています。それらを「user_scores」と呼びます。次のようにするだけです。
もちろん、これは次のことを前提としています。ユーザーのスコアに基づいて昇順に並べ替えています。ユーザーとユーザーのスコアを返したい場合は、次のように実行する必要があります:
ZRANGEuser_scores010WITHSCORES
AgoraGames は良い例で、Ruby で実装されており、そのランキングでは Redis を使用してデータを保存しています。 。
- パブリッシュ/サブスクライブ
最後に (もちろん重要ですが) Redis のパブリッシュ/サブスクライブ機能です。パブリッシュ/サブスクライブには実際に多くの使用例があります。人々がこれをソーシャル ネットワーク接続で使用したり、パブリッシュ/サブスクライブ ベースのスクリプトのトリガーとして使用したり、Redis のパブリッシュ/サブスクライブ機能を使用してチャット システムを構築したりしているのを見てきました。
29. Redis でサポートされる Java クライアントは何ですか?公式で推奨されているのはどれですか?
Redisson、Jedis、レタスなど。公式では Redisson を使用することを推奨しています。
30. Redis と Redisson の関係は何ですか?
Redisson は、ユーザーがいくつかの Java オブジェクト (Bloomfilter、BitSet、Set、SetMultimap、ScoredSortedSet、SortedSet、Map、ConcurrentMap、List、ListMultimap、Queue、BlockingQueue) を簡単に実装できるようにする高度な分散調整 Redis クライアントです。 、Deque、BlockingDeque、セマフォ、ロック、ReadWriteLock、AtomicLong、CountDownLatch、パブリッシュ/サブスクライブ、HyperLogLog)。
31. ジェディスとレディソンの長所と短所は何ですか?
Jedis は、Java の Redis によって実装されたクライアントです。その API は、Redis コマンドに対する比較的包括的なサポートを提供します。
Redisson は、Jedis に似た分散型でスケーラブルな Java データ構造を実装します。 Redis の機能は比較的単純で、文字列操作はサポートされておらず、並べ替え、トランザクション、パイプライン、パーティションなどの Redis 機能もサポートされていません。 Redisson の目的は、ユーザーの懸念事項を Redis から分離して、ユーザーがビジネス ロジックの処理に集中できるようにすることです。
32. Redis のパスワードを設定し、パスワードを確認するにはどうすればよいですか?
パスワードの設定: config set require pass 123456 認可パスワード: auth123456
33. Redis ハッシュ スロットの概念について話しますか?
Redis クラスターは一貫したハッシュを使用しませんが、ハッシュ スロットの概念を導入しています。Redis クラスターには 16384 のハッシュ スロットがあります。各キーは、CRC16 チェックに合格した後、16384 の剰余を取得することによって決定されます。スロットを配置する場合、クラスター内の各ノードはハッシュ スロットの一部を担当します。
34. Redis クラスターのマスター/スレーブ レプリケーション モデルとは何ですか?
一部のノードに障害が発生した場合、またはほとんどのノードが通信できなくなった場合でもクラスターを引き続き使用できるようにするために、クラスターはマスター/スレーブ レプリケーション モデルを使用し、各ノードには N-1 個のレプリカが存在します。
35. Redis クラスターで書き込み操作は失われますか?なぜ?
Redis はデータの強力な一貫性を保証しません。つまり、実際には、特定の条件下でクラスターが書き込み操作を失う可能性があります。
36. Redis クラスターはどのようにレプリケートされますか?
非同期レプリケーション
37. Redis クラスター内のノードの最大数はどれくらいですか?
16384。
38. Redis クラスター用のデータベースを選択するにはどうすればよいですか?
Redis クラスターは現在データベースを選択できず、デフォルトはデータベース 0 です。
39. Redis の接続をテストするにはどうすればよいですか?
ping
40. Redis でのパイプラインの用途は何ですか?
リクエスト/レスポンス サーバーは、古いリクエストがまだ応答されていない場合でも、新しいリクエストを処理できます。これにより、応答を待たずに複数のコマンドをサーバーに送信し、最終的にその応答を 1 ステップで読み取ることができます。
これはパイプライン処理であり、数十年にわたって広く使用されてきたテクノロジーです。たとえば、多くの POP3 プロトコルはこの機能のサポートを実装しており、サーバーから新しい電子メールをダウンロードするプロセスが大幅に高速化されます。
41. Redis トランザクションを理解するにはどうすればよいですか?
#トランザクションは単一の分離された操作です。トランザクション内のすべてのコマンドはシリアル化され、順番に実行されます。トランザクションの実行中、他のクライアントから送信されたコマンド要求によって中断されることはありません。トランザクションはアトミックな操作です。トランザクション内のすべてのコマンドが実行されるか、まったく実行されないかのどちらかです。
42. Redis トランザクションに関連するコマンドは何ですか?
MULTI、EXEC、DISCARD、WATCH
43. Rediskey の有効期限と永久有効性をそれぞれ設定するにはどうすればよいですか?
EXPIRE および PERSIST コマンド。
44. Redis はどのようにメモリを最適化しますか?
ハッシュ テーブル (ハッシュ) をできるだけ使用します。ハッシュ テーブル (ハッシュ テーブルに格納される数値が小さいことを意味します) は非常に少量のメモリを使用するため、データ モデルを可能な限り抽象化する必要があります。ハッシュテーブル内で可能。たとえば、Web システムにユーザー オブジェクトがある場合、ユーザーの名前、姓、電子メール、パスワードに個別のキーを設定せず、すべてのユーザー情報をハッシュ テーブルに保存します。
45. Redis のリサイクル プロセスはどのように機能しますか? #クライアントが新しいコマンドを実行し、新しいデータを追加しました。
Redi はメモリ使用量をチェックし、maxmemory の制限を超えている場合は、設定されたポリシーに従ってリサイクルされます。新しいコマンドが実行されるなど。
つまり、常に境界に到達し、その後常に境界未満にリサイクルすることで、メモリ制限の境界を超え続けます。
コマンドの結果によって大量のメモリが使用される場合 (大規模なセットの共通部分を新しいキーに保存する場合など)、メモリ制限を超えるまでにそれほど時間はかかりません。このメモリ使用量。
プログラミング関連の知識について詳しくは、
プログラミング ビデオ
をご覧ください。 !
以上がRedis キャッシュに関するインタビューの質問を要約して共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。