ホームページ  >  記事  >  Redis の面接の質問の概要、それについて学びましょう

Redis の面接の質問の概要、それについて学びましょう

藏色散人
藏色散人転載
2019-02-22 13:21:4017311ブラウズ

春の採用活動と転職活動のピーク時期がやってきました。プログラマーの皆さんは、コードを入力して昇給に向けて動き始めるという考えに耐えられなくなっていますか?今日はredisの面接で聞かれる質問をまとめていきます!

トピックの推奨: 2020 redis 面接の質問 (最新)

Redis の面接の質問の概要、それについて学びましょう

#1. redis とは何ですか。 ?

Redis は、メモリベースの高性能キー/値データベースです。 (推奨事項 1:

Redis ビデオ チュートリアル ) (推奨事項 2: mysql チュートリアル )

2. Reid の特徴

Redis は基本的に、memcached とよく似た Key-Value タイプのメモリ内データベースであり、データベース全体が操作のためにメモリにロードされ、データベース データは定期的な非同期操作を通じてストレージ用のハードディスクにフラッシュされます。 Redis は純粋なメモリ操作であるため、優れたパフォーマンスを備え、1 秒あたり 100,000 を超える読み取りおよび書き込み操作を処理できます。これは、実行されることが知られている中で最速の Key-Value DB です。

Redis の優れた点はパフォーマンスだけではありません。また、memcached とは異なり、1 つの値の保存が 1 GB に制限されていることも最大の魅力です。 Redis は、List を使用した FIFO 二重リンク リストの作成、軽量で高性能なメッセージ キュー サービスの実装、Set を使用した高性能メッセージ キュー サービスの作成など、多くの便利な機能の実装に使用されます。タグシステムなど。さらに、Redis は保存された Key-Value の有効期限を設定できるため、memcached の拡張版としても使用できます。

Redis の主な欠点は、データベース容量が物理メモリによって制限され、大量のデータの高パフォーマンスな読み取りおよび書き込みには使用できないことです。そのため、Redis に適したシナリオは主に高パフォーマンスに限定されます。少量のデータの操作と計算。

3. Redis を使用する利点は何ですか?

(1) HashMap と同様にデータがメモリに保存されるため高速です HashMap の利点は、検索と操作の計算量が O(1)

## であることです。 # (2) 豊富なデータ型をサポート、文字列、リスト、セット、ソートセット、ハッシュをサポート

(3) トランザクションをサポート、操作がアトミックであることは、データに対するすべての変更が実行されることを意味します。またはすべて 未実行

(4) 豊富な機能: キャッシュ、メッセージング、キーによる有効期限の設定に使用でき、有効期限が切れると自動的に削除されます。 memcached の利点と比較した Redis の利点は何ですか?

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

(2) Redis は memcached よりも高速です はるかに高速です (3) redis はデータを永続化できます

5. Memcache と Redis の違いは何ですか?

1). 保存方法 Memecache はすべてのデータをメモリに保存します。停電後はデータがメモリ サイズを超えることはありません。 Redis の一部はハードディスクに保存されるため、データの永続性が保証されます。

2)、データ サポートの種類 Memcache のデータ型のサポートは比較的単純です。 Redis には複雑なデータ型があります。

3)、使用される基礎となるモデル、基礎となる実装方法、およびクライアントと通信するためのアプリケーション プロトコルが異なります。一般的なシステムがシステム関数を呼び出すと、移動やリクエストに一定の時間が無駄になるため、Redis は独自の VM メカニズムを直接構築しました。

6.Redis の一般的なパフォーマンスの問題と解決策:

1).マスターがメモリ スナップショットを書き込み、save コマンドが rdbSave 関数をスケジュールするため、作業がブロックされます。スナップショットが比較的大きい場合、パフォーマンスに大きな影響を及ぼし、サービスが断続的に停止するため、マスターがメモリ スナップショットを書き込まないことをお勧めします。

2) マスター AOF 永続化。AOF ファイルが書き換えられない場合、この永続化方法によるパフォーマンスへの影響は最も小さくなりますが、AOF ファイルが大きすぎると、サイズが増大し続けます。マスターの再起動速度に影響します。マスターでは、メモリ スナップショットや AOF ログ ファイルなどの永続化作業を行わないことが最善です。特に、データが重要な場合は、スレーブで AOF バックアップ データを有効にする必要があります。 1 秒に 1 回同期します。

3) マスターは BGREWRITEAOF を呼び出して AOF ファイルを書き換えます。AOF は書き換え中に大量の CPU リソースとメモリ リソースを占有するため、サービスの負荷が高くなりすぎてサービスが一時的に停止されます。

#4)。Redis マスター/スレーブ レプリケーションのパフォーマンスの問題。マスター/スレーブ レプリケーションの速度と接続の安定性を考慮すると、スレーブとマスターを同じ LAN

## に配置することが最適です。

#7. mySQL には 2,000 万のデータがありますが、redis には 200,000 のデータしか保存されません。redis 内のデータがホット データであることを確認する方法

関連知識: Redis メモリ データ セットが特定のサイズに増加すると、データ陳腐化戦略 (リサイクル戦略) が実装されます。 redis は 6 つのデータ削除戦略を提供します。

volatile-lru: データセット (server.db[i].expires) から最も最近使用されていないデータを選択し、有効期限を設定して削除します

volatile-ttl: 削除する有効期限が設定されたデータ セット (server.db[i].expires) から期限切れになるデータを選択します

volatile-random: 有効期限が設定されたデータ セット (server.db[i].expires) から削除するデータをランダムに選択します

allkeys-lru: データ セット (server.db[i) から] .dict) を選択し、最も最近使用されていないデータを選択して

allkeys-random: データ セット (server.db[i].dict) から任意のデータを選択して

no- enviction (eviction ): データのエビクションを禁止します

8. Redis および任意の言語を使用して、各ユーザー ID の 1 時間以内のログインを最大 5 回に制限する悪意のあるログイン保護コードを実装してください。特定のログイン関数または関数については、空の関数を使用するだけでよく、詳細に記述する必要はありません。

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

Redis は、最速の読み取りおよび書き込み速度を実現するために、すべてのデータをメモリに読み込みます。メモリにアクセスし、データを非同期でディスクに書き込みます。つまり、redis は高速でデータの永続性が高いという特徴を持っています。データがメモリに配置されていない場合、ディスク I/O 速度は Redis のパフォーマンスに重大な影響を与えます。メモリがどんどん安くなっている現在、redis の人気はますます高まるでしょう。

最大使用メモリが設定されている場合、データ レコード数がメモリ制限に達すると、新しい値を挿入できなくなります。

10.Redis は単一プロセスおよび単一スレッドです

redis はキュー テクノロジーを使用して同時アクセスをシリアル アクセスに変換し、従来のデータベース シリアル制御のオーバーヘッドを排除します

11. Redis の同時実行競合の問題を解決するにはどうすればよいですか?

Redis は単一プロセスのシングルスレッド モードであり、同時アクセスをシリアル アクセスに変えるためにキュー モードを使用します。 Redis 自体にはロックの概念がありませんが、Jedis クライアントが同時に Redis にアクセスすると、接続のタイムアウト、データ変換エラー、クライアントによる接続の切断などの問題が発生する可能性があります。

はすべてクライアント接続の混乱が原因です。これには 2 つの解決策があります:

1. クライアントの観点から見ると、各クライアントが通常の順序で Redis と通信できるようにするために、接続がプールされ、同時にクライアントもプールされます。 Redis 操作の読み取りと書き込みは同期されます。

2. サーバーの観点からは、setnx を使用してロックを実装します。

注: 最初のタイプでは、アプリケーションはリソースの同期を独自に処理する必要があります。使用できる方法は比較的一般的で、同期またはロックを使用できます。2 番目のタイプでは Redis を使用する必要があります。 setnx コマンドを使用しますが、いくつかの問題に注意する必要があります。

12. Redis の CAS (オプティミスティック ロックを実装するためのチェック アンド セット操作) についての理解?

他の多くのデータベースと同様、Redis は NoSQL データベース トランザクションも提供します。機構。 Redis では、MULTI/EXEC/DISCARD/WATCH の 4 つのコマンドがトランザクション実装の基礎となります。この概念は、リレーショナル データベース開発の経験がある開発者にとっては馴染みのないものではないと思いますが、Redis でのトランザクションの実装特性を簡単にリストします。

1) トランザクションでは、すべてのコマンドが逐次実行されます。トランザクションの実行中、Redis は他のクライアント要求にサービスを提供しないため、トランザクション内のすべてのコマンドがアトミックに実行されます。

2)。リレーショナル データベースのトランザクションと比較すると、Redis トランザクションでコマンドの実行が失敗しても、後続のコマンドは引き続き実行されます。

3) MULTI コマンドを使用してトランザクションを開始できます。これは、リレーショナル データベース開発の経験がある人であれば、「BEGIN TRANSACTION」ステートメントとして理解できます。このステートメントの後に実行されるコマンドは、トランザクション内の操作とみなされます。最後に、EXEC/DISCARD コマンドを実行することで、トランザクション内のすべての操作をコミット/ロールバックできます。これら 2 つの Redis コマンドは、リレーショナル データベースの COMMIT/ROLLBACK ステートメントと同等であるとみなすことができます。

4) トランザクションが開始される前に、クライアントとサーバーの間で通信障害が発生し、ネットワークが切断された場合、その後実行されるすべてのステートメントはサーバーによって実行されません。ただし、クライアントが EXEC コマンドを実行した後にネットワーク中断イベントが発生した場合、トランザクション内のすべてのコマンドがサーバーによって実行されます。

5) 追加専用モードを使用する場合、Redis はシステム関数 write を呼び出して、トランザクション内のすべての書き込み操作をディスクに書き込みます。ただし、電源障害によるダウンタイムなど、書き込みプロセス中にシステム クラッシュが発生した場合、その時点ではデータの一部だけがディスクに書き込まれ、データの他の部分が失われる可能性があります。

Redis サーバーは、再起動時に必要な一連の整合性チェックを実行し、同様の問題が見つかるとすぐに終了し、対応するエラー プロンプトを表示します。現時点では、Redis ツールキットで提供されている redis-check-aof ツールを最大限に活用する必要があります。このツールは、データの不整合エラーを特定し、書き込まれたデータの一部をロールバックするのに役立ちます。修復後、Redis サーバーを再度再起動できます。

13. WATCH コマンドと CAS ベースのオプティミスティック ロック:

Redis トランザクションでは、WATCH コマンドを使用して CAS (チェック アンド セット) 機能を提供できます。 。トランザクションが実行される前に、WATCH コマンドを通じて複数のキーを監視すると仮定します。WATCH 後にいずれかのキーの値が変更された場合、EXEC コマンドによって実行されたトランザクションは放棄され、呼び出し元に通知するために Null マルチバルク応答が返されます。トランザクションの

実行に失敗しました。たとえば、キー値のアトミックなインクリメントを完了するための incr コマンドが Redis に提供されていないと再び仮定します。この関数を実装したい場合は、対応するコードを自分で記述するしかありません。疑似コードは次のとおりです。

val = GET mykey
val = val + 1
SET mykey $val

上記のコードは、単一の接続の場合にのみ実行結果が正しいことを保証できます。これは、複数のクライアントがこのコードを同時に実行している場合、マルチスレッド プログラムでよく発生するエラー シナリオ - 競合状態 (競合状態) が発生します。たとえば、クライアント A と B の両方が、mykey の元の値を同時に読み取り、その値が 10 であるとします。その後、両方のクライアントが値に 1 を追加して、その値を Redis サーバーに設定し直します。結果は 11 であり、予想していた 12 ではありません。同様の問題を解決するには、WATCH コマンドの助けが必要です。次のコードを参照してください。

WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

前のコードとの違いは、新しいコードは値を取得する前に WATCH コマンドを通じてキーを監視することです。 set コマンドもトランザクションで囲まれています。これにより、各接続が EXEC を実行する前に、現在の接続で取得した mykey の値が他の接続されているクライアントによって変更された場合に、現在の接続の EXEC コマンドが確実に実行されるようにすることができます。実行に失敗します。このようにして、呼び出し元は戻り値を判断して、val が正常にリセットされたかどうかを知ることができます。

14. Redis 永続化のいくつかの方法

1. スナップショット

デフォルトでは、Redis はデータ スナップショットをディスク上のバイナリ ファイルに保存します。名前は dump.rdb です。たとえば、N 秒ごとにデータ セットに M を超える更新がある場合、データがディスクに書き込まれるか、コマンド SAVE または BGSAVE を手動で呼び出すことができます。

動作原理

。 Redis フォーク。

.子プロセスは一時 RDB ファイルへのデータの書き込みを開始します。

.子プロセスが RDB ファイルの書き込みを完了したら、古いファイルを新しいファイルに置き換えます。

.この方法により、Redis はコピーオンライト テクノロジを使用できるようになります。

2. AOF

スナップショット モードはあまり堅牢ではなく、システムが停止したり、Redis が誤って終了したりすると、Redis に書き込まれた最後のデータが失われます。これは一部のアプリケーションでは大きな問題にならない場合がありますが、高い信頼性が必要なアプリケーションの場合、

Redis は適切な選択ではありません。

追加専用ファイル モードも別のオプションです。

設定ファイルで AOF モードをオンにできます。

3. 仮想メモリ モード

キーが小さく、値が大きい場合、VM を使用する効果が大きくなります。この方法で保存されるメモリは比較的大きいため、

キーが小さくない場合は、たとえば、大きなキーを大きな値に変換する特別な方法を使用することを検討できます。

vm-max-threads このパラメータは、スワップ ファイルにアクセスするスレッドの数を設定できます。マシンのコア数を超えないようにすることが最善です。 0 に設定すると、スワップ ファイルへのすべてのアクセスが行われます。操作はすべてシリアルです。これにより、長い遅延が発生する可能性がありますが、データの整合性は十分に保証されます。仮想メモリを使用した場合のパフォーマンスも良好であることがわかりました。データ量が大きい場合は、分散データベースやその他のデータベースを検討できます。

15. Redis のキャッシュ無効化戦略と主キー無効化メカニズム

キャッシュ システムとしては、データは定期的にクリーンアップして無効にする必要があります。データには主キーの無効化と削除戦略が必要です。


Redis では、有効期間を持つキーは揮発性と呼ばれます。キャッシュを作成するときは、特定のキーの有効期間を設定します。キーの有効期限が切れると (有効期間は 0)、削除される可能性があります。

1. 生存時間に影響する一部の操作

生存時間は、DEL コマンドを使用してキー全体を削除するか、SET および GETSET によって元のデータを上書きすることで削除できます。つまり、キーに対応する値を変更し、同じキーと値で上書きした後、現在のデータの生存時間は異なります。

たとえば、キーに対して INCR コマンドを実行したり、リストに対して LPUSH コマンドを実行したり、ハッシュ テーブルに対して HSET コマンドを実行したりしても、これらの操作によってキー自体の生存時間は変更されません。一方、RENAME を使用してキーの名前を変更した場合、名前を変更したキーの生存時間は名前を変更する前と同じになります。

RENAME コマンドのもう 1 つの可能性は、生存時間を持つキーの名前を生存時間を持つ another_key に変更しようとすることです。このとき、古い another_key (およびその生存時間) は削除されます。古いキーはanother_keyという名前に変更されるため、新しいanother_keyの生存時間は元のキーと同じになります。 PERSIST コマンドを使用すると、キーを削除せずにキーの有効期間を削除し、キーを再び永続キーにします。

2. 生存時間の更新方法

すでに生存時間が設定されているキーに対して EXPIRE コマンドを実行すると、新しく指定した生存時間で古い生存時間が置き換えられます。有効期限の精度は 1ms 以内に制御されており、主キー障害の時間計算量は O(1) です。

EXPIRE は TTL コマンドで使用され、キーの現在の生存時間を表示できます。 。設定が成功した場合は 1 を返し、キーが存在しない場合、またはキーに生存時間を設定できない場合は 0 を返します。

最大キャッシュ構成

redis では、ユーザーは最大メモリ サイズを設定できます

server.maxmemory

默认为0,没有指定最大缓存,如果有新的数据添加,超过最大内存,则会使redis崩溃,所以一定要设置。redis 内存数据集大小上升到一定大小的时候,就会实行数据淘汰策略。

redis 提供 6种数据淘汰策略:

. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

. no-enviction(驱逐):禁止驱逐数据

注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。

使用策略规则:

1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru

2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random

三种数据淘汰策略:

ttl和random比较容易理解,实现也会比较简单。主要是Lru最近最少使用淘汰策略,设计上会对key 按失效时间排序,然后取最先失效的key进行淘汰

16.redis 最适合的场景  

Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?

如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

1 、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

2 、Redis支持数据的备份,即master-slave模式的数据备份。

3 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

(1)、会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

(2)、全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。

此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

(3)、队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

(4),排行榜/计数器

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

(5)、发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

Redis提供的所有特性中,我感觉这个是喜欢的人最少的一个,虽然它为用户提供如果此多功能。

相关推荐:

Redis教程

2020年前端vue面试题大汇总(附答案)

声明:
この記事はPHP开源社区で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。