インタビューはRedisにこの記事を読むように頼んだ十分です

1. NoSqlデータベース(メモリデータベース、非リレーショナルデータベース)とは何ですか?

1. redis
2. mongdb
3. memcache
4. tair(Taobao自己開発)

2. Redisとは何ですか?

1. Redisは完全にオープンソースで無料であり、高性能ですKey-Valueデータベース
2. Redisは単一スレッドに基づいていますC言語記述
3. RedisにはWindowsバージョンはなく、Linuxバージョンのみ

3.リレーショナルデータベースと非リレーショナルデータベースの違いは何ですか?

リレーショナルデータベース:データはハードディスク
はい、データが読み取られるたびに、それはio操作であり、効率は比較的低くなります。非リレーショナルデータベース:データは記憶永続化操作のメカニズムもいくつかあります

4つのRedisアプリケーションシナリオ:

1.トークンの生成!
2.キャッシュクエリデータを実現でき、リレーショナルデータベースへのアクセス負担を軽減できます!
3.分散ロック!
4.遅延操作:たとえば、注文が行われて支払いが行われない場合、在庫が減少します。タイムアウト期間を設定でき、タイムアウト後に在庫が増えます!

具体例子,比如下单30分钟未支付自动更新订单状态
1、采用定时任务,30分钟后检查该笔订单是否已经支付(性能不好,不推荐)
2、根据key有效期时间回调实现(推荐)
实现
	1、创建订单的时候绑定一个订单token(不用订单编号是因为不安全)存放在redis中(有效期只有30分钟)
	2、token过期时执行回调方法判断订单状态

5.分散メッセージミドルウェア
6、ログ
7、SMS検証コードのコード
8、実装カウンター

5.なぜRedisにはLinux版しかなく、Windows版がないのですか?

1. Redisの採用NioのIO多重化メカニズム、1つのスレッドを使用して複数のRedisクライアント接続を維持し、非常に良い並行性をサポートし、スレッドの安全性を確保
2. Windowsの場合セレクターを選択それはforループを使用し、空をポーリングしやすく、時間の複雑さはO(n)
3.です。Linuxでは、epollを使用してイベント駆動型コールバックを実装します。空のローテーショントレーニングはなく、アクティブソケット接続のみがアクティブコールバックを実現します。パフォーマンスが大幅に改善されたため、時間の複雑さはO(1)

6. Redisの16(0〜15)ライブラリの機能は何ですか?

異なるライブラリのキーは同じにすることができますが、同じライブラリのキーを同じにすることはできません

7. Redisのメモリはいっぱいになりますか?

Redisはデフォルトでメモリの上限を設定しません。通常、これは使用可能なメモリのサイズです。maxmemoryでも構成できます。データが制限されたサイズに達すると、データを削除するための構成方法が選択されます

8. Redisにはどのようなデータ型がありますか?

1.文字列(文字列タイプ):最大512MBを格納できます
2.ハッシュ:キーと値(キー=>値)のペアのセット
3.リスト(リスト):挿入順にソートされた文字列の単純なリスト。リストの先頭(左側)または末尾(右側)に要素を追加できます
。4.セット(セット):セットはハッシュテーブルを介して実装されるため、追加、削除、検索の複雑さはすべてO(1)
5です。 、Zset(ソート済みセット:順序付きセット):セットも文字列型要素のコレクションであり、重複したメンバーは許可されていません

9. Redisがオブジェクトを保存する方法は何ですか?

1.使用json
利点のシリアル化と逆シリアル化:直感的、視覚的、クロス言語の
短所:メモリを占有する、安全でない
2、redisのシリアル化方法を使用する(シリアル化バイナリ)、エンティティクラスはシリアル化されたインターフェースを実装する必要があります。
利点:セキュリティ、バイナリ比較はメモリを占有しません。
短所:非表示、バイナリは言語をまたがることができず、Javaオブジェクトにのみ変換でき、他の言語のオブジェクトに変換できません。jsonは言語をまたがることができます

10.完全同期と増分同期の違いは何ですか?

1.完全同期:データを別の場所にコピーするのは、毎日のタイミング(高い放棄を回避する)または実装のサイクルです。
頻度はそれほど大きくありませんが、データが失われる可能性があります。
2.増分同期:データを同期するために動作操作が使用され、頻度が非常に高く、サーバー同期への圧力も非常に大きいため、データが失われることはありません。

11.永続性を実現するためのRDFとAOFの違いは何ですか?

1.永続性を達成するためのデータログ操作に基づくAOF増分同期appendonly.aof
aof ファイルを開く:
3つのaofモードでredis.confのappendonlyをyesに変更し
ます。1. appendonly always:データが変更されたときに書き込み、同期時間が
長くなり、IO操作が頻繁に行われる2、appendonly everysec(デフォルト):使用緩衝地帯毎秒定期的にバッファーからAOFファイルに書き込みます
。3 が欠けている可能性があります。appendonlyno Never sync。効率的ですが、データは永続的ではありません。AOF2
、RDB(デフォルト)、タイミング永続化メカニズム==、完全同期==、1つあります一時RDBファイルそして最終的なRDBファイル永続化されるたびに、最後のRDB一時ファイルを上書きする一時RDBファイルが生成されます。Redisが停止すると、一時ファイルは最終的なRDBファイルになります。Redisが復元された後、最後のdump.RDBファイルを使用してメモリに復元します。定期的に実行すると、forkサブプロセスが起動して、データをハードディスクに同期します。たとえば、次のように変化の数は、永続的があるだろう、何もキーが10回以上を持っていない90秒後に決定される
注:aofとrdbの両方が有効になっている場合は、最初にaofを使用します
ここに画像の説明を挿入

12. MySQLとRedisはどのようにしてデータの一貫性を維持しますか?

1.直接Redisキャッシュをクリアする、再クエリ
2.直接使用mq購読mysql binlog(更新、挿入、および削除の操作はすべて記録されます)ログファイルはRedis
3に段階的に同期されます。運河(最下層は方法2)

13、SpringBoot、Redisアノテーションバージョン

1. @EnableCacheをメインクラスに追加します
2. @Cacheableをメソッドに追加します(cacheName = "category directory"、key = "'は通常メソッド名であり、単一引用符を追加する必要があります")
3.オブジェクトはシリアル化インターフェイスを実装します

14. Redisの6つの主要なメモリ消去戦略:メモリ空間がいっぱいになると、古いデータは自動的に追い出されます

1. noeviction(デフォルト):メモリ使用量がしきい値に達したら、コマンドを実行しますメモリ使用量がしきい値に達したら、コマンドを直接実行しますエラーを報告する
2. allkeys-lru:in全部重要なのは、優先度の削除最近使用されていませんキー。(推奨)
3. allkeys-random:in全部キーでは、ランダム除去キー。
4. Volatile-lru:設定後有効期限のキースペースで最近使用されていないキー
5.揮発性ランダム:設定有効期限キースペースでは、ランダムキーを削除します。
6、volatile-ttl:設定済み有効期限のキースペースで早く期限切れ時間キーが最初に削除されます。

15. Redisでのトランザクション

Redisトランザクション操作:Redisにはロールバックはありませんが、コミットトランザクションのキャンセルがあります
マルチ:トランザクションを開き、キーと値をキューに入れ、アトミックに保ちます
EXEC:トランザクション
コミットします破棄:コミットトランザクションをキャンセルし
ますウォッチ:1つ以上を監視できますキー、トランザクションをコミットする前に変更があったかどうか。エッジの変更がある場合、トランザクションは送信されず、変更がない場合にのみトランザクションを送信できます。

watch name 			//启动监听
multi				//开启事务
set name xiaoxiao	//添加key-value
exec				//提交事务

16. RedisとMysqlのトランザクションの違いは何ですか?

Redisトランザクションは分離されません。同時に、ロックなしで同じデータを操作します。データを最後に送信する人は、
MySQLトランザクションの種類によって分離されます。

17.トランザクションのキャンセルとトランザクションのロールバックの違いは何ですか?

トランザクションをロールバックする:トランザクションを
キャンセルして行ロックを解放するトランザクションをキャンセルする:単にトランザクションをキャンセルする

18.分散ロックとは何ですか?シーンを与える

ローカルロック:複数のスレッドでは、1つのスレッドのみの実行が保証されます(スレッドセーフティの問題)
分散ロック:分散では、1つのjvmのみの実行が保証されます(複数のjvmスレッドセーフティの問題)。たとえば
、クラスター内の各jarは同様に、jarパッケージにはスケジュールされたタスクがあります。複数のjarがこのスケジュールされたタスクを繰り返し実行します。現時点では、分散ロックを使用して、タスクの繰り返しスケジュールの問題を解決できます。

19番目、分散ロックのコアアイデアを解決するには:

1.ロックを取得します。複数の異なるJVMが同時にタグ(グローバルに一意のタグ)を作成します。成功したタグを作成できる人は誰でもロックを取得します
2. ロックを解放します:グローバルに一意のタグを解放し、他のJVMが再び入り、ロックリソースを取得します
3.残業ロック:タイムアウト戦略に従って対処する方法を決定します

#### 20.分散ロックを実装する3つの方法:
1.データベースベースのアプローチ:行ロックを最初に取得する人、分散ロックを取得する人
2. Zkベースのアプローチ:一時ノード+イベント通知
3. Redisの実装:setnxコマンドを使用してキーを作成すると、最初にキーを正常に作成した人が誰でも分散ロックを取得できます
。4。フレームワークを使用します。たとえば、Redisの公式Webサイトには、分散ロックを解決するためのredisフレームワークがあります。

set:如果key不存在则创建,存在则修改原值
setnx:如果key不存在则创建,返回1,存在则不执行任何操作,返回0

21、分散ロックを実現するためのRedisとzkの長所と短所?

ロックの取得:ロックの
解放がほとんど:
タイムアウトロックがほとんど:zkはセッションタイムアウトを使用します。これは効率が悪く、現在のセッション接続を閉じ、現在のzkノードパスを自動的に削除し、他のスレッドはロック取得フェーズに入ります。期限が切れると、Redisキーが自動的にロックを解除します

22.ビジネスロジックがタイムアウトに達していない場合はどうなりますか?

方法1:作成したビジネスロジックに従っておおよその時間を決定し、キータイムアウト時間を設定する
方法2:トランザクションの送信時にロックがタイムアウトしたかどうかを確認し、タイムアウトした場合はロールバックし、それ以外の場合は送信します(推奨)

23.分散ロックの適用シナリオ?

1.分散タスクスケジューリングプラットフォームは、タスクのべき等性を保証します
2.分散グローバルIDの生成

24. Redisクラスターで高可用性を実現する3つの方法は?

1.従来のマスター/スレーブレプリケーション
2.マスター/スレーブレプリケーション+センチネルメカニズム
3. シャードクラスタ

25. Redisマスター/スレーブレプリケーションの原則

1. redis.confから:slaveofは、マスターサービスのマスターIPおよびポート番号とパスワードをポイントします
。2.起動後、マスターとスレーブは長いソケット接続を確立します
3.全量を使用し(aofの代わりにバイナリのdump.rdbファイルを送信)、増加しますデータはAOFの形式でスレーブredisサーバーに同期されます。スレーブノードが初めて起動すると、マスターノードは全量の形式でデータを同期します。その後、マスター書き込みデータは増分になります
。4.ネットワークに問題があります。スレーブノードはマスターに接続しますノード、マスターノードは、データの増分が同期されるたびに、欠落しているデータを再発行します

主master:做读写操作  
从slaveof:只读,把写操作交给主节点

ここに画像の説明を挿入

26、従来のワンマスターマルチスレーブにはどのような問題がありますか?

1.マスターノードに問題がある場合、Redis環境全体で書き込み操作を
実行できません。マスター操作になるには、構成を手動で変更する必要があります。この問題の解決方法:監視メカニズムを使用すると、Redisクラスターのマスター/スレーブ選択戦略を解決できます。
2.同期サーバーが多く、効率が低いため、ツリー形式が使用されます

27. Redis歩哨メカニズムの役割は何ですか?

Redisセンチネルメカニズムは、マスタースレーブレプリケーションの欠陥(選択の問題)を解決し、問題を解決して、Redisの高可用性を確保し、自動化を実現します故障発見フェイルオーバー

28.センチネルメカニズムの原理

1.センチネルメカニズムは、infoレプリケーションコマンドの形式を使用して、Redisクラスター全体(ノード構造全体)の現在の環境リストを10秒ごとに取得できます。マスターノードをリッスンするように構成するだけです。
2.複数の監視ユニットが同じマスターノードをリッスンし、同じチャネルにサブスクライブします。新しい監視ユニットが参加すると、サービスに関する情報がチャネルに送信されます。チャネルのサブスクライバは、新しい監視ユニットを見つけて互いに参加できます。長い接続。Redis自体にチャネルがあります。センチネルは同じチャネルとクラスターにサブスクライブします。3。
マスターの障害により、単一のセントリーがマスターマスターノードにpingコマンドを送信することがわかりました。マスターノードが時間内に応答しない場合、セントリーはマスターノードを「主観的」と見なします「ステータスの使用」は、マスターノードが使用できないかどうかを確認するために他のセントリーに送信されます。現在確認されているセンチネルノードの数> =クォーラム(構成可能)により、再選が達成されます

29.センチネルクラスターの数をRedisスレーブノードの数と同じにする必要があるのはなぜですか?

選挙の公平性を確保するために、歩哨は選挙のみを行い、マスタースレーブ複製は行いません

30.従来のセンチネルメカニズムの問題は何ですか?

Redis監視クラスターモードでは、各ノードは同期されたデータの全量を保存します。より冗長なデータがあります;そして、Redisクラスターモデルのクラスターで使用シャーディングされたクラスターモード缶冗長データを削減、欠点は、クラスターモデルを構築することです非常に高いコスト

31. Redisシャーディングクラスター

Redis3.0は、クラスターモードRedisClusterを正式に開始しました。原則は、事前に割り当てられたハッシュスロットの概念を採用しています。16384カードスロット、およびカードスロットを特定のサービスノードに割り当てます。キー== crc16(key)%16384 ==残りを取得し、残りは対応するカードスロットの位置です読み取りまたは書き込みをカードスロットのサービスノードに転送するキー。最大のポイントは、動的な拡大と縮小です。

Redis5.0配布カードスロットはより便利です。3および4配布は非常に面倒です。プラグインをインストールする必要があります

/usr/redis/bin/redis-cli --cluster create  192.168.212.163:7000  192.168.212.163:7001  
192.168.212.163:7002  192.168.212.163:7003  192.168.212.163:7004  192.168.212.163:7005  
--cluster-replicas 1

1は、比率が1であることを意味します。最初の3つが優勢で、後の3つがスレーブです。デフォルトでは、転送機能はありません。このコマンドの後にクラスターを表す-cを追加すると、転送が行われます。 Redisは他のredisに転送できます。マスターノードにのみカードスロットがあり、スレーブノードにはありません

32. Redis分割クラスターの拡張と縮小

展開時に指定されたノードに割り当てられ、
削減は各ノードに均等に分配されます。

33. Redisのセキュリティ関連コンテンツ:データベースへの大きなプレッシャー

1.キャッシュペネトレーション:redisに存在しないアクセスキー、redisをバイパスしてデータベースに直接アクセスすること、および頻繁な高同時クエリが原因でキャッシュが役に立たなくなること
ソリューション:
1.インターフェイスはAPI電流制限を実装し、ddosから保護し、インターフェイス頻度制限
2。データベースからデータを照会できず、redisできない場合は、データベースのnull値をキャッシュに書き込み、有効期間を短くします(単一のキーにのみ適しており、通常の使用に影響します。推奨されません)
3、ブルームフィルター
2.キャッシュの内訳:同時実行性が高い状態でホットスポットキーにアクセスすると、ホットスポットキーが突然期限切れになり、すべての要求がデータベースに直接アクセスする
解決策:
1.分散ロックを使用して解決し、サーバークラスターに適したクエリデータベースをロックして、キャッシュへのクエリデータの1つ、もう1つは直接キャッシュ
2を読み取り、ローカルロックは分散ロック
3 と同じ、ソフト有効期限、ホットスポットキーの無制限の有効期間を設定、非同期拡張時間
3を取得、キャッシュ雪崩:キャッシュの内訳とほぼ同じ、はい複数のホットスポットキーが同時に失敗するか、redisが再起動し、永続化
ソリューションがない
デプロイメントキーを割り当てるクラスタリング

34.ブルームフィルターに基づいてキャッシュ侵入の問題を解決する

ブルームフィルター:公開データ構造アルゴリズムはredisに固有のものではありません。セットに要素が存在するかどうかを判断するのに適していますが、誤判断の問題がある可能性があります。確率は非常に低いです。デフォルトの確率3は誤判断されます。誤判断の確率が低いほど、配列の長さが長くなります。設定はどの程度適切ですか?プロジェクトに依存

ウォームアップメカニズム:本番環境では、事前にホットスポットキーをredisにキャッシュする必要があります。Bloomフィルターを使用して、最初にredisキャッシュにデータを入れます。redisキャッシュをクエリするときは、BloomではなくBloomフィルターから確認してくださいこれは、redisキャッシュがないことを意味します

キャッシュの内訳は、ブルームフィルターを使用して解決され
ます。1.ウォームアップ:データベース内のデータをブルームに入れます
。2.ブルームフィルターにクエリを実行します。ブルームに存在しない場合は、データベースにそのようなキーがないことを意味します
。3.クエリを再実行します。
4. redisに存在しない場合は、データベースにクエリを実行します。誤判定

query id = 66、Bloomフィルターに存在し(実際には存在しないはずです)、データベースにクエリする前にredisに存在しません。

================================================== ========================
redisキーも値もnullにすることはできませんjedis
、redisをJavaクライアントに接続するためのツール、クラスターはデフォルトではサポートされていません、デフォルトはサポートのリダイレクト
質問:ディストリビューションには強い整合性はなく、最終的な整合性しかありません。zkは強い整合性ではありませんか?

マルチレベルキャッシュは装飾モードで実装されています

ほとんどのキャッシュフレームワークには、消去戦略(Redisメモリの遅い消去戦略、先入れ先出し)、永続化メカニズムの基本機能があり、EhCacheには永続化メカニズムがありません

Redisキーの自動有効期限メカニズムを使用する
キーが無効な場合、クライアントのコールバックコールバックメソッドを実行できます。
Redisで設定する必要があります:
notify-keyspace-events "Ex"

バージョン番号の楽観的ロック

値はuuidを使用して、それが独自のスレッドであるかどうかを判別します

Redis分散ロックは、スタンドアロンバージョンとクラスターバージョンで異なる方法で実装されます

現在のノードがマスターノードかどうかを知る方法は?
コマンド経由:情報の複製

歩哨はどのようにマスターノードを選びますか?
redisスレーブノードがダウンしている場合はどうすればよいですか?

小さなプロジェクトにはセンチネル、大きなプロジェクトにはクルーザー

53件の元の記事を公開しました Likes2 訪問1871

おすすめ

転載: blog.csdn.net/qq_42972645/article/details/104611050