「緩和ビットインタビュアー」シリーズ - キャッシュアバランシェ降伏、浸透

より多くのあなたが知っている、より多くのあなたは知りません

再び親指アップ、習慣

序文

Redisのストレージでのインターネット技術を、このような広範な使用、ほぼすべてのインタビュアーがである必要があり、バックエンド技術のRedisの小さなパートナーのは、360°の使用と尊敬の原則のために物事を困難にしました。(の平面Paの申し出を取るための最初のインターネット企業として请允许我使用一下夸张的修辞手法、多くの競合他社を)打つ、各時間は唯一の私は自分の過ちから学ぶ、孤独な日夜に、数え切れないほどの孤独な数字はやや有罪、失望残さ見るために、書き込みを開始することを決めた《吊打面试官》暴行や同僚とのインタビューをずらすせ、あなたの面接を頼むぶら下げ、シリーズを面接した後、あなたにgangbustersのような読者を助けたい、360°のインタビュアーの反撃、クレイジー収穫メーカーが提供します!

少し感情

もともと保存されている公開番号に原稿を考え、入浴時間は、ゲームの夜について考え、それが記事、単に個人的な感情の内容とは関係ありません、何かを書くために、コンピュータ開いていると思うが、私は昨日見たどのように多くの小さなパートナーを知らないSKT VS G2のゲームを私も覚えてどのように多くの小さなパートナーを知らないFakerそのシーンの手ブレを。

IMG

あなたはそれが私がワールドカップでサポートして、私の心の震えも横に振ったとき、私は彼を見た、見た感じかわからないLPLチームが、私はリー兄弟の男、勝つために献身のようなものを好きなので、長年にわたって彼らの主張に固執するの一種で、だけそんなに誘惑が私はああ大好きな人の前で優勝してほしい、私はそれのような多くの人が考えています。

できるだけ多くのと同じように、英雄の夕暮れの友人が言ったが、私は多くの人々は、我々は米のような若いプログラマーが、唯一食べることもできますが、あなたが彼らの主張に固執する場合、腹部の詩やガスであることを言ったように、彼は、些細なことだったと思います中国からのアバディーンは、私は最終的には確かに自分の取得を取得すると思います。

まあ、私はセンセーショナルない、と私たちは今の技術について話し始めました。

テキスト

暴行と我々はRedisのの基本を言及シリーズに掛かって、振り返ることができ、小さなパートナーを読み取るためには至っていません

「ビットインタビュアーイージング」シリーズ-Redis基礎

述べたRedis私は面接、または実際の開発プロセスキャッシュでいることを信じて雪崩穿透击穿それに慣れていないですが、満たされていない場合でも、あなたは最終的には3の間に違いがあること、聞いたこと、私たちは、このようなないようにする方法でなければなりません我々が次の犠牲者を要求してきた、起こります。

インタビューの始まり

便便たる、中年の男、高速な脱毛の毛を見て、フルスクラッチMacはあなたに来る保持し、チェック柄のシャツを着て、それは確かにニマのトップ建築家で考えて!しかし、我々は、中国、仮想ではない仮想から詩やガスを腹部。

IMG

私は、共通の直接の憎悪いくつかの主要な問題、Redisの雪崩はそれを理解し、我々はポイントにまっすぐに指示し、若い男があなたの履歴書上のRedisを書いたと思いますか?

こんにちはハンサム魅力的なインタビュアーが、私が知っている、現在の電気供給者が自宅行いますと、ホットスポットデータ・キャッシュは、キャッシュは通常リフレッシュする、または見つけ出す後に更新するタスクをタイムアウトされ、定期的なタスクのリフレッシュ問題があります。

ここでは簡単な例です:キーホームの有効期限のすべてが12時間、午前12時00分更新であれば、私は多数のユーザーのゼロスパイク活動の流入を持っている、という仮定は、毎秒6000個の要求だった、それは各カン朱にキャッシュされている可能性があり秒5000リクエストが、キャッシュは、すべてのキーが無効であるでした。1秒必然的に運ぶことができなかった、それは警察に報告されるすべてのデータベース、6000要求オフこの時点では、実際の状況は、応答が直接DBAにリンクされていない来たかもしれません。この無用の障害に対処するための特別なプログラム場合は、この時点では、DBAは、データベースを再起動するために急いでいたが、データベースが殺害にすぐに新しい流量となっています。これは、キャッシュ雪崩の私の理解です。

我刻意看了下我做过的项目感觉再吊的都不允许这么大的QPS直接打DB去,不过没慢SQL加上分库,大表分表可能还还算能顶,但是跟用了Redis的差距还是很大

同一时间大面积失效,那一瞬间Redis跟没有一样,那这个数量级别的请求直接打到数据库几乎是灾难性的,你想想如果打挂的是一个用户服务的库,那其他依赖他的库所有的接口几乎都会报错,如果没做熔断等策略基本上就是瞬间挂一片的节奏,你怎么重启用户都会把你打挂,等你能重启的时候,用户早就睡觉去了,并且对你的产品失去了信心,什么垃圾产品。

インタビュアーは、このような状況がZezhengことを、ああも、彼の髪に触れましたか?あなたはどのように対処するですか?

キャッシュアバランシェ過程をへのバッチで、シンプルでRedis、あなたがそのデータを確保することができますので、うまくランダムな値を追加するには、各キーの故障時には、私は信じて、同時に障害が発生した大面積ではないデータが保存されたときにRedisのこのトラフィックやホールドアップ。

setRedis(Key,value,time + Math.random() * 10000);
复制代码

場合はRedis、クラスタの展開、異なるホットデータの均一な分布Redisライブラリは、障害のすべての問題を避けることができますが、私は、単一の個々のサービスに対応し、本番環境でこのスラグクラスタを操作する際にあるRedisデータを容易にするために、断片化管理だけでなく、それは、そのような失敗の欠点を有していてもよく、ランダム故障時間は良い戦略です。

または無期限にホットデータを設定し、(オペレーションおよびメンテナンスがホーム製品の更新など、あなたが逃げるキャッシュを磨く、有効期限を設定しない)のようなキャッシュの更新の更新操作があり、家庭用電気の供給者も、このデータを使用することができます操作、保険。

そして、あなたはどのようなキャッシュが浸透し、内訳を理解し、彼らはそれの雪崩との違いを見分けることができますか?

ああ、理解して、それがキャッシュに浸透することについて私がお話しましょう、キャッシュ浸透がデータキャッシュとデータベースを参照することはなく、ユーザーが要求を開始していき、私たちのデータベースIDの増分は、このようなIDの打ち上げとして、起動、1 IDデータまたは-1の値は、特に大規模なデータが存在しないです。今回は、ユーザーが攻撃者である可能性が高い、攻撃者はそれを真剣にデータベースを台無しにしてしまう、データベースに過度の圧力を引き起こす可能性があります。

小点的单机系统,基本上用postman就能搞死,比如我自己买的阿里云服务

像这种你如果不对参数做校验,数据库id都是大于0的,我一直用小于0的参数去请求你,每次都能绕开Redis直接打到数据库,数据库也查不到,每次都这样,并发高点就容易崩掉了。

缓存击穿だけでなく、これと缓存雪崩少し似ていますが、そこにキャッシュバッファは、障害の大面積アバランシェあるので、崩壊はDBを打つ、少し異なっており、キャッシュは内訳が異なる缓存击穿キーを参照することは非常に暑いです、運ぶノンストップ現在進行中の大規模なキャッシュによって複雑に障害が発生した時点でのキーは、そのままバケツに穴を開けなどの直接データベース要求を、身に着けていたとき、これに集中アクセスポイントによって複雑に大きな、大きな同時。

IMG

インタビュアーは、彼らが解決されたか、その後、慰めのビジョンを公開しました

缓存穿透私は、例えば、このようなユーザ認証チェックとして界面層の増加を確認するチェックパラメータを作成し、不正なパラメータが直接コードを返します:idが基本的なチェック、ID <= 0の直接傍受を行います。

这里我想提的一点就是,我们在开发程序的时候都要有一颗“不信任”的心,就是不要相信任何调用方,比如你提供了API接口出去,你有这几个参数,那我觉得作为被调用方,任何可能的参数情况都应该被考虑到,做校验,因为你不相信调用你的人,你不知道他会传什么参数给你。举个简单的例子,你这个接口是分页查询的,但是你没对分页参数的大小做限制,调用的人万一一口气查 Integer.MAX_VALUE 一次请求就要你几秒,多几个并发你不就挂了么?是公司同事调用还好大不了发现了改掉,但是如果是黑客或者竞争对手呢?在你双十一当天就调你这个接口会发生什么,就不用我说了吧。这是之前的Leader跟我说的,我觉得大家也都应该了解下。

キャッシュからのデータの到達範囲は、データベースが、あなたはまた、値の対応するキーを書き込むことができ、に取得していないnullの場合、位置誤差は、後でもう一度この値が具体的にどのような製品を取るように頼まれてみてください、または特定を参照してくださいシーンは、キャッシュの有効時点が30秒(通常は使用することはできませんし、あまりにも長いリードを設定)など短く設定することができます。

これは、攻撃が繰り返し同じユーザーID暴力的な攻撃を使用しないように、私たちは、ゲートウェイ層という、通常のユーザーは、単一の第二で何度も要求を開始しませんされて知っている必要がありNginx、このスラグのは、私も大いに運用・保守を可能にする設定項目を覚えています単一のIPへのアクセスは、第2のIPあたり回の閾値数が黒ドラッグ超えます。

あなたが他の方法を持っていますか?

そして、私はそれを覚えているRedisの高い使い方がされた布隆过滤器(Bloom Filter)キャッシュは浸透が発生を防止することは非常に良いことができ、彼はまた、非常に単純な原理だ効率的なデータ構造とアルゴリズムの使用はすばやくキーであるかどうかを判断されたデータベースに存在する、ノーありあなたが返すように、あなたは、DBのリフレッシュKVの有無をチェックしてから返すように行ってきました。

同時に多くのIPハッカーの攻撃、それがある場合は少しを持っているパートナーが言うには?これは私がいない非常にXiangdeトンでしたが、ハッカーの一般的なレベルではない。また、通常のレベルそんなにチキン、やったRedisクラスタはこのレベルのアクセスを耐えることができるが、小さな会社は、私は、彼らが興味を持っているとは思いません。高可用性システムは、クラスタの良い仕事、それができる、まだトップを行います。

缓存击穿その後、ホットデータを無期限に設定してください。または取得することがミューテックスを追加作为暖男,代码我肯定帮你们准备好了

   /**
     * 获取数据
     * @param Key											查询参数
     * @return data										数据
     * @throws InterruptedException		异常
     * @author 敖丙
     */
    public static String getData(String Key) throws InterruptedException {
        // 从redis查询数据
        String result = getDataByKV(Key);
        // 参数校验
        if (StringUtils.isBlank(result)) {
            // 获取锁
            if (reenLock.tryLock()) {
                // 去数据库查询
                result = getDataByDB(Key);
                // 校验
                if (StringUtils.isNotBlank(result)) {
                    // 搞进缓存
                    setDataToKV(Key, result);
                }
                // !!!释放锁 正常会在finally里面释放
                reenLock.unLock();
            } else {
                // 睡一会再拿
                Thread.sleep(100L);
                result = getData(Key);
            }
        }
        return result;
    }
// 这里面的锁都是单机玩玩,分布式锁还是得靠lua脚本这样的
复制代码

インタビューの終わり

うーん良い、三点は、あなたが、私はRedisのクラスタ高可用性、マスター・スレーブ同期、およびその他の知識センチネルについてお聞きしていき明日二面接に来るそして今日は最初にここのインタビューのために遅くはありませんが、非常によく答え、とされています問題点を。

ヘイローは、実際に面接の次のラウンドを持っています!(ハハ強制の次号を伏線)が、提供まだなめるする必要があり、フンフン、良いハンサムインタビュアーへ。

答えは、詳細は助けることができなかったので、とても満ちていたが、ポイントのように(暗示点赞,每次都看了不点赞,你们想白嫖我么?你们好坏喲,不过我喜欢⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

概要

私たちは、ジョークのインタビューを取ってはいけない、ダウンタウンの繁華街を行く、遊びに行くプレー。

簡単に導入されたこの論文、、、 3は実際には、似ていますが、いくつかの違いがあるが、実際には、このインタビューは、キャッシュが貫通、キャッシュ雪崩ので、我々は混乱3を取ることはありません、お願いします依頼することですそして、内訳は、最大の問題は、キャッシュされ、または問題が致命的になると、表示されませんので、インタビュアーはあなたを聞いてきます。Redis雪崩击穿穿透

我々はそれを理解しなければならない怎么发生的、とするか避免、そして、彼らが発生した後に行くか抢救、あなたは深さでそれを知ることはできませんが、あなたはそれについて考えていないことができ、時々インタビューあなたはおそらく、必ずしも知識の拷問ではありません拷問の態度は、あなたの明確な思考なら、知其然还知其所以然それは同様ですが、また再び仕事からそれを防ぐ方法を知っています。

最後に、私はあなたの小さな技術的な要約なるように暖かい男を与え続けます。

一般的には3つの期間から、我々の分析に上記の出来事を避けます:

  • 事前:Redis可用性、マスタースレーブ+センチネル、Redis cluster総崩壊を回避することができます。

  • 物事中:ローカルehcacheキャッシュ+ Hystrix避けるために降格+制限がMySQL殺されます。

  • その後:Redis永続RDB+ AOF、一度再起動し、データを自動的にディスク、キャッシュされたデータの迅速な復旧からロードされます。

上記のすべての点は、私は暴行に話すだろうし、より完全な、電流制限コンポーネントは、あなたが秒あたりの要求を設定することができ、要求の残りを通じて部品の数はどのように行う、合格しない今月のRedisについての一連の記事をぶら下げRedisのは、それがあるべき?ダウングレード行きますあなたは、いくつかのデフォルト値、またはヒント、または空白値を返すことができます。

利点:

データベースは、第二のパスあたりの要求だけを確実にするためのコンポーネントの数を制限し、死ぬことはありません。限り、データベースが死ぬと、そのユーザーのために、と言うことです、3/5を要求処理することができます。3/5は限り要請があったとして、それはあなたのシステムは、おそらく数回のクリックでページを磨く、ユーザーのために、死んではありませんが、いくつかの倍以上、あなたが一度それを磨くことができることを意味し、処理することができます。

这个在目前主流的互联网大厂里面是最常见的,你是不是好奇,某明星爆出什么事情,你发现你去微博怎么刷都空白界面,但是有的人又直接进了,你多刷几次也出来了,现在知道了吧,那是做了降级,牺牲部分用户的体验换来服务器的安全,可还行?

まあ、誰もが、それは、この記事の内容全体だ、私はいくつかは、「毎週更新されて戻ってくるインタビュアー暴行とぶら下げシリーズとJavaテクノロジー・スタック関連記事」。あなたはまた、私にメッセージを残すことができるか、知りたいと思えば、私たちは一緒に進行、書く時間を持つことになります。

言葉の書き込みでは、これは悪くない場合は、こちらを見てどうもありがとうございました求点赞 求关注 求分享 求留言ご支援とご認識のための**(私には非常に便利)**を、作成は私の最大の動機である、我々は次の記事を参照してください!

青プロパン|テキスト[元]


「暴行とインタビュアーをぶら下げ」、更新していきます毎週公共一連の数字を読むために私の最初の時間を追跡することができ、アリ、網易、PDD、そして作品を破っ時折(バイトを推進する機会最初の層のメーカーで友人があるだろう、そこにキノコのストリートを雇用し、仕事、どのような問題は、直接私をドロップすることができ、私は新人だったが、スラグ人として一緒に私たちの進行には影響しません、私はあなたが仕事与えることはできません)、あなたは事の暖かさに戻すことができないのですか?

おすすめ

転載: juejin.im/post/5dbef8306fb9a0203f6fa3e2