Redisのよくある質問

ギャングの記事

キャッシュ雪崩とは何ですか

通常、我々はデータ層を保護するためにキャッシング層を行うための要求の多くを運ぶが、とき
あなたはたとえば、期限切れの(ダブル十二の多数のキー値内のRedisとき、私は、これらの商品の1時間を1時間の有効期限を設定すると後で、私はすぐにスパイクし始めましたデータベースが原因でオフだ圧力の崩壊には大きすぎるかもしれ際の情報は、表面のないキャッシュが存在しないこの時点で、この時点で同時に)データベースへの直接の同時要求、これらの要求のRedisへのダイレクトアクセス要求の数が多い集団故障ではありませんキャッシュ雪崩

ソリューション:

  • 多数の要求が直接私の過去にアクセスしたときにダウングレードを制限することは、私が唯一のデータベースクエリへの要求を行う、のRedisへの照会データ
  • キャッシュは、別の有効期限を設定し、キャッシュキーは、(あなたは私の差し迫った有効期限が設定良い製品を販売していると言う、長い手動トリガ異なる負荷に大きな同時アクセスする前に、キャッシュを更新するために缶キャッシュ・リロード・メカニズムは、事前を温めます私はそうであっても、できるだけキャッシュミスの時点という、)短い少しの少し一般的な設計を買いました。

キャッシュの浸透

私たちが欲しいのは、我々はフロントデスクにリクエストを送信するときは、Redisのは、それに行くには、あなたが値を要求しなかった場合は、データベースクエリではないことをこの時点でRedisの圧力によりデータベースキャッシュ層を減らすために来たときにキャッシュが、私たちの通常のプロセスに浸透しています、そして今回は、いくつかの悪意のある人々は、あなたのデータベースに直接ダウンデータ多数の要求をキャッシュしませんブルートフォース法により内部のRedisを見つけるために行くだろうありますが、データベースが非常に大きくない場合、データベースは狂った(データにあなたを圧迫しません。しかし、その後、あなたはキャッシュに浸透している)彼らは直接疲れデータベースへの要求の多くを見つけることができないことがわかります

  • 私たちはブルームフィルタによって解決することができソリューション

(私は注文番号をお持ちでない場合は、注文番号を確認すると、私は彼に1または0の状態を与えた)ときに、データベースのデータを持っていない場合は
、あなたが私のRedisのデータへのアクセスを要求し、この時点で私は状態は0です見ました私のデータベースは、私が直接データのその部分を持っていないあなたを伝えるためにあなたの要求を拒否することはできませんしません。

  • 私は直接のRedisにヌル・リターン・データを発見していないことを直接ブルートは有効期限が少し短いです設定した場合、私はあなたを伝える際にチェックするために、次回はこれがnullであるあなたのためか、60秒を言います

キャッシュの内訳

頻繁にアクセス直接保護カバーに浸透していると有効期限が切れたときにどのような内訳キャッシュがあることはホットキーであります

ソリューション:

  • 私はあなたがホットデータは、シンプルで、粗することができませんでしたが、彼はタイマーで設定するか、この私はタイマーを設定し構築するためにあなたのタスクを設定し、30分で29分であなたの健康、この時間を更新するには、このタスクを満了し、より限定されていますキーの値は、まだ比較的実現可能性を固定されている場合
  • キーキャッシュの有効期限(絶対時間)保存キャッシュに行ってきました(スプライスされることができ、別のキーを使用することができます保存...どのような形で、あなたがいる限り2がライン上で良好な関係を確立して、新しいフィールドを追加することができます)。各実行でget操作の後、我々は、キャッシュの有効期限から抜け出すだろうとの比較を行うために、現在のシステム時刻は、キャッシュの有効期限場合 - 現在のシステム時刻(定義された値から)<= 1分、その後、アクティブなバッファことをキャッシュにこの性を保証を更新します。データは常に最新である(とプログラムとして、そのデータの有効期限が切れないこと。)極端なケースがある場合は、しかし、キャッシュを使用すると、などを呼び出してから、キャッシュを更新するために取得することはできません来て、この時点で要求されていない、あなたはすぐに有効期限が切れていることですお時間が終わって、キーの有効期限が切れて、すぐに終了し、高い同時実行の波にご案内します
  • 達成するためにロックを使用します
 //创建一个锁
static Lock reenLock = new ReentrantLock();

    public List<String> getData04() throws InterruptedException {
        List<String> result = new ArrayList<String>();
        // 从缓存读取数据
        result = getDataFromCache();
         //判断若是没有数据
        if (result.isEmpty()) {
             //判断是否获取到锁
            if (reenLock.tryLock()) {
                try {
                    System.out.println("我拿到锁了,从DB获取数据库后写入缓存");
                    // 从数据库查询数据
                    result = getDataFromDB();
                    // 将查询到的数据写入缓存
                    setDataToCache(result);
                } finally {
                    reenLock.unlock();// 释放锁
                }

            } else {
                result = getDataFromCache();// 先查一下缓存
                if (result.isEmpty()) {
                    System.out.println("我没拿到锁,缓存也没数据,先小憩一下");
                    Thread.sleep(100);// 小憩一会儿
                    return getData04();// 再来一此
                }
            }
        }
        return result;
    }

戦略持続性のRedis

  • RDB(データスナップショットモード)、通常のストレージ、データ自体の保存は、ファイルをコンパクトに格納されます。

  • AOF(追加モード)、データが変更されるたびに、ハードディスク(書き込みログ)に同期、その変更レコードのデータを保存

  • あなたが唯一のメモリに格納されたデータが必要な場合は、その後、戦略の両方の種類を閉じることができます

  • Redisの再起動は、AOFは、元のデータファイルを再構築するために使用されるときにも、同時に戦略の両方のタイプを開くことができます

    RDBは、メモリに設定されたバックアップデータを、スケジュール。サーバーの起動時には、RDBファイルからデータセットを回復することができます。

利点

  • ファイルをコンパクトに格納されます
  • 異なるバージョンのデータのバックアップおよび容易な回収に適し
  • 災害復旧のための適切な、バックアップファイルは、他のサーバーに復元することができます
  • ファイルがあまりにも議会ブロックされている場合は保存され、Redisののパフォーマンスを最大化するために、バックアップが子スレッドを開始された場合、親プロセスはIO操作は、現在のスレッドのスナップショットを保存することである必要はありませんスレッドが(ユーザーエクスペリエンスが悪いので、シングルスレッド性能はRedisのゆっくりサブスレッドがスレッドマイクロ秒遮断係合するフォークを使用して作成bgsave)
  • データ保持速いAOFより

短所

1つのRedisのは、正常にシャットダウンし、停止動作していない場合ので、セーブポイントの最後の間でデータが失われる
データの量が多い、そして、フォークの時間がかかり、もしCPUがある場合、原因バックアップ操作に頻繁にフォーク子スレッドの必要性2パフォーマンスが十分ではありません、サーバがカトンかもしれません。大量のデータは、複数のサービスを展開していないRedisのサーバーに属するとき。

次の5つの形式のスナップショットを作成します。

  • BGSAVEコマンドを送信し、サーバは子スレッドをforkするクライアントは、ディスクスナップショットに書き込まれます
  • クライアントは、サーバのアドレス操作がメインスレッドで実行され、SAVEコマンドを送信します。それは多くの場合、BGSVAEを実行するために一般的に使用された場合にのみ十分なメモリを使用していません
  • SAVEは、SAVE 300 100のようなセットの設定項目であり、「300秒で100回が書かれている」ときに、Redusが自動的BGSAVEコマンドをトリガします。複数の設定項目がある場合は、いずれかの出会いは、バックアップをトリガーします
  • Redisのは、SHUTDOWN(シャットダウン)受信したコマンドがシャットダウンするサーバー、または信号TERM要求により、SAVE命令を実行すると、すべてのクライアントをブロックします。この時間は、それがクライアントから送信された任意のコマンドを実行しません。
  • RedisのRedisのサーバーが別のサーバーに接続し、プライマリサーバが実行BGSAVE運転中でない場合、または単にマスターサーバーを実行する場合は、コピー操作を開始するためにSYNC(シンク)コマンドのように互いを送信する場合は、マスターサーバーがGBSAVEを実行します

AOF(アペンドファイルのみ)

AOFレコードは、すべてのサーバーを書き込みます。ときに、サーバーが再起動し、再実行するすべてのデータのバックアップを実現するために、再び書き込みます。書き込み動作は、(元のデータセットよりも大きい)大きすぎる設定されている場合、Redisの書き込み動作セットを書き換えます。

利点

  • あなたは異なる戦略を持つことができるので、より柔軟な使用AOFモードにfsync
  • AOFはredusチェック-AOFツールは簡単に修復することができ、ファイルの最後にはこれらの受注の半分に書かれていても、停電の問題に損傷がない場合でも、すべての不要な位置、ログファイルに追加されます
  • ときAOF文書の多くは、Redisのは、バックグラウンドで自動的に書き換えられます。Redisの新しいファイルを作成するための操作に必要なデータ・セットの現在の最小セットを作成するために使用されている古いファイルを追加し続けることですので、書き換えは絶対に安全ですが、一度作成し、Redisのは新しいファイル、スタートに切り替わります新しいファイルに追加の操作を実行
  • AOFは、別の操作コマンドの後1、理解しやすいと決意を含めます

短所

同じデータセットの場合は、AOFファイルは通常、RDBファイルよりも大きい
AOFのfsync戦略に応じて、RDBよりも遅くなることがあります。通常のfsync(同期ポリシー)1秒に1回に設定されている場合、パフォーマンスが速いとしても、高負荷時に、sfyncをオフにしてもRDB場合は、まだ非常に高いです。しかし、書き込み負荷の下で、RDBはまだ良い最大遅延保証を提供することができ
、増分更新データのスナップショットでAOF1をスクラッチRDBから作成され、RDBは、より堅牢で安定していることでしょう(それはバックアップに適しています)

Redisのデータ型がサポートされていますか?

文字列:
フォーマット:SETキー値の
文字列型はバイナリセーフです。文字列の意味Redisのは、任意のデータを含めることができます。そのようなJPGイメージまたはシリアライズ目的とします。
Redisのは、最大512MBのキーを格納することができ、文字列データ型の最も基本的なタイプです。

ハッシュ(ハッシュ)
フォーマット:名前hmset VALUE1 KEY1 KEY2 VALUE2
Redisのハッシュキー(キー=>値)のペアです。
Redisのハッシュフィールドは、文字列型とマッピングテーブルの値であり、ハッシュは、特にオブジェクトを格納するのに適しています。

一覧(リスト)
Redisのリストの文字列、ソート挿入順序の単純なリストです。あなたは(左側)のリストの先頭または(右側)の尾部に要素を追加することができます
フォーマット:lpush名前値
先頭列要素のリストに対応する鍵に追加された
フォーマット:rpush名の値は、
リストの末尾に対応するキーに文字列要素を追加する
フォーマット:lrem名前のインデックス
リストに対応するキーと要素のようにカウント値を削除する
形式:llen名前が
リストの長さに対応するキーを返します

セット(コレクション)
フォーマット:サッド名の値
Redisのは、順序付けられていないコレクションの種類を設定した文字列です。
コレクションは、検索の複雑さはO(1)であるので、追加、削除、ハッシュテーブルによって達成されます。

ZSET(ソートセット:順序付きコレクション)
フォーマット:スコアZadd名値
RedisのをZSETとは、文字列型要素のコレクションとして設定され、重複したメンバーを許可していません。
違いは、ダブルスコアは要素の各タイプに関連付けされることです。それは小さなからのメンバーの合格点のコレクションの大きな順にRedisのにあります。
ZSETメンバーはユニークですが、スコア(得点)、それを繰り返すことができます。

Redisのクラスタ

次いで、3.0サポートRedisのクラスタのクラスタリングのRedis、Redisのクラスタフリー中央構造、データ記憶ノードとクラスタ全体の状態の各々は、すべてのノードと他のすべてのノードが接続されています。
特徴:
1、(存在しないパフォーマンスのボトルネックノードに影響)のないセンターアーキテクチャ、以下のプロキシ層。

図2は、データスロットによれば、分散された複数のノードに格納されたノード間のデータ共有、データの分布が動的に調整することができるされています。

図3は、スケーラビリティは1000のノードへ直線的に拡張可能な、ノードが動的に追加または削除されてもよいです。

図4に示すように、高可用性は、部分的なノードは、クラスタがまだ利用可能で、利用できません。スレーブを増やすことで、データのバックアップコピーを作成します

5、ノード間の自動フェイルオーバーを実現するための障害が、ゴシッププロトコルを介してステータス情報を交換し、マスターの役割を強化するために、投票機構にスレーブで完了します。

短所:

1、リソースの分離状況は互いに影響しやすい、貧しい人々です。

2、非同期データ・レプリケーション、強力なデータの一貫性を保証するものではありません。

Redisのは、分散ロックを達成するために使用しました

詳細ギャングの説明

その後、Setnxロックを取得するためにスクランブル、そしてつかんで、そしてロック解除忘れを防止有効期限を期限切れにロックを追加します。

あなたが突然クラッシュしたり、維持を再起動するsetnxプロセスの後に期限切れ前に実行した場合、どうなりますか?

パラメータの非常に複雑な命令セットがありますが、これは使用に同時に合成指示をsetnxし、期限切れにすることができるはず!

Redisのは、非同期キューをどうするかを使用することで、あなたはどのように使うのですか?欠点は何ですか?

構造は、一般的にキューリスト、rpushメッセージ生産、LPOP消費メッセージとして使用されています。適切な睡眠へのメッセージは、もう一度試していないだろうときLPOP。

短所:

組立ラインオフ消費者の場合には、生産は、メッセージキューがそうでRabbitMQのようプロを使用する必要がありますと、メッセージが失われます。

多くの場合、消費者はそれを生成することはできませんか?

Nメッセージキュー:使用パブ/サブトピックサブスクライバモードは、1を達成することができます。

公開された23元の記事 ウォンの賞賛2 ビュー927

おすすめ

転載: blog.csdn.net/metjoyful/article/details/103723547