Redisのキャッシュアバランシェ降伏、浸透

参考ギャング

序文

Redisのストレージでのインターネット技術を、このような広範な使用を、ほぼすべてのバックエンド技術面接のであるべきRedisの小さなパートナーが360の利用度と尊敬の原則のために困難なものを作っていたの。(直面しているインターネット企業でのMianbaプラン取る時間として私が使用することを許可してください、それはレトリックを誇張が)、数多くの競争相手を打ち負かすだけ無数の孤独な姿を見るために、それぞれの時間は多少有罪、失望を残し、孤独な日の夜に、私の苦い経験は、書き込みを開始することを決めた「鼓動とインタビュアーぶら下げ」シリーズを、ヘルプを望んgangbustersのようなあなたの読者をインタビュー、360のインタビュアーの反撃後°、暴行やハングのインタビューを聞かせて、あなたの面接を頼みますずらす同僚、クレイジー収穫メーカーが提供します!

テキスト

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

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

ことを言及Redisの私はインタビューの中で信じている、または実際の開発プロセスはキャッシュ雪崩貫通は内訳はそれに慣れていないですが、最終的には3の間に違いがあること、聞いたことが満たされていない場合でも、我々その後、これを防ぐためにどのようにする必要があり、我々は次の犠牲者を要求しました。

インタビューの始まり

フルスクラッチMACを保持便便たる、チェック柄のシャツを着た中年男が、それは確かにニマのトップアーキテクトで考えて、速いはげかかっ髪を見て、あなたに来ます!しかし、中国から我々腹部詩やガス、仮想仮想ではありません。

IMG

私は若い男があなたの履歴書上のRedisを書いた、そして我々はポイントに直接ストレート、ダイレクト憎悪いくつかの主要な問題の一般的な、Redisの雪崩はそれを理解と思いますか?

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

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

私は意図的に、今そんなに再ハングQPSにDBへの直撃を許可されていない私は感じをしたプロジェクトを見て、しかし遅いSQLデータベースプラスポイント、大きなテーブルがまだテーブルトップを分割することができるかもしれしませんでしたが、ギャップはまだ大きなRedisのです

IMG

同じ時間がないのRedisと失敗の大面積、でその瞬間、要求は直接あなたがそれについて考えると吊り彼の他のライブラリに依存しているライブラリのユーザーサービスである場合は、データベースは、ほとんど壊滅的であるヒットというレベルの数など行われていない場合は、ほぼすべてのインターフェイスのは、与えられているユーザーは、早期の睡眠に行き、あなたのときに再起動することができますので、あなたは、ユーザーがあなたのプレイハングします再起動しないか、瞬時のヒューズとリズムにリンクされている他の戦略は基本的です製品には、どのような迷惑メールへの信仰を失いました。

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

キャッシュ雪崩プロセスは、バルクで、シンプルでのRedisの、あなたはそのデータが同時に障害が発生した大面積、私は信じていないことを確認することができますように、各キーの有効期限が、うまくランダムな値を追加する際に保存されたデータ、この流れのRedisまたは耐えます。

setRedis(Key,value,time + Math.random() * 10000);

場合Redisのは、クラスタの展開で、異なるホットデータの均一な分布のRedisのライブラリはまた、すべての障害の問題を回避することができますが、私は、本番環境で動作するクラスタをスラグ、この時間は、単一のサービスは、単一の対応であるのRedisの断片化、ですデータの管理を容易にするために、しかし、欠点も、このような故障している可能性があり、偶発故障時には良い戦略です。

或者设置热点数据永远不过期,有更新操作就更新缓存就好了(比如运维更新了首页商品,那你刷下缓存就完事了,不要设置过期时间),电商首页的数据也可以用这个操作,保险。

那你了解缓存穿透和击穿么,可以说说他们跟雪崩的区别么?

嗯,了解,我先说一下缓存穿透吧,缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。

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

IMG

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

至于缓存击穿嘛,这个跟缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是缓存击穿是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。

IMG

面试官露出欣慰的眼光,那他们分别怎么解决

缓存穿透我会在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。

这里我想提的一点就是,我们在开发程序的时候都要有一颗“不信任”的心,就是不要相信任何调用方,比如你提供了API接口出去,你有这几个参数,那我觉得作为被调用方,任何可能的参数情况都应该被考虑到,做校验,因为你不相信调用你的人,你不知道他会传什么参数给你。

举个简单的例子,你这个接口是分页查询的,但是你没对分页参数的大小做限制,调用的人万一一口气查 Integer.MAX_VALUE 一次请求就要你几秒,多几个并发你不就挂了么?是公司同事调用还好大不了发现了改掉,但是如果是黑客或者竞争对手呢?在你双十一当天就调你这个接口会发生什么,就不用我说了吧。这是之前的Leader跟我说的,我觉得大家也都应该了解下。

从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试这样的值具体取啥问产品,或者看具体的场景,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。

这样可以防止攻击用户反复用同一个id暴力攻击,但是我们要知道正常用户是不会在单秒内发起这么多次请求的,那网关层Nginx本渣我也记得有配置项,可以让运维大大对单个IP每秒访问次数超出阈值的IP都拉黑。

那你还有别的办法么?

还有我记得Redis还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。

那又有小伙伴说了如果黑客有很多个IP同时发起攻击呢?这点我一直也不是很想得通,但是一般级别的黑客没这么多肉鸡,再者正常级别的Redis集群都能抗住这种级别的访问的,小公司我想他们不会感兴趣的。把系统的高可用做好了,集群还是很能顶的。

缓存击穿的话,设置热点数据永远不过期。或者加上互斥锁就能搞定了

作为暖男,代码我肯定帮你们准备好了

IMG

面试结束

嗯嗯还不错,三个点都回答得很好,今天也不早了,面试就先到这里,明天你再过来二面我继续问一下你关于Redis集群高可用,主从同步,哨兵等知识点的问题。

晕居然还有下一轮面试!(强行下一期的伏笔哈哈)但是为了offer还是得舔,嗯嗯,好的帅气面试官。

能回答得这么全面这么细节还是忍不住点赞

暗示点赞,每次都看了不点赞,你们想白嫖我么?你们好坏喲,不过我喜欢

总结

我们玩归玩,闹归闹,别拿面试开玩笑。

本文简单的介绍了,Redis雪崩击穿穿透,三者其实都差不多,但是又有一些区别,在面试中其实这是问到缓存必问的,大家不要把三者搞混了,因为缓存雪崩、穿透和击穿,是缓存最大的问题,要么不出现,一旦出现就是致命性的问题,所以面试官一定会问你。

大家一定要理解是怎么发生的,以及是怎么去避免的,发生之后又怎么去抢救,你可以不是知道很深入,但是你不能一点都不去想,面试有时候不一定是对知识面的拷问,或许是对你的态度的拷问,如果你思路清晰,然后知其然还知其所以然那就很赞,还知道怎么预防那来上班吧。

最后暖男我继续给你们做个小的技术总结:

一般避免以上情况发生我们从三个时间段去分析下:

  • 事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
  • で物事:ローカルにehcacheキャッシュ+ Hystrix避けるために+ダウングレードを制限するには、** MySQLの**殺されました。
  • その後:Redisの永続RDB + AOFの再起動後、データは自動的にディスク、キャッシュされたデータの迅速な復旧からロードされ、。

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

利点:

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

最も一般的であり、現在主流のインターネットの巨人は、あなたが好奇心ではなく、スターが何かを壊した、あなたは空白の画面を磨く方法をマイクロブログに持っていることがわかりますが、一部の人々が直接あなたのブラシに変身します数回出てきた、そして今それを知って、それがいいことができ、セキュリティサーバと引き換えに、ユーザーエクスペリエンスの一部を犠牲にし、ダウングレードを行われていましたか?

おすすめ

転載: www.cnblogs.com/Dr-wei/p/11908371.html