Redis雪崩、击穿、穿透

雪崩

目前电商首页以及热点数据都会去做缓存 , 一般缓存都是定时任务去刷新,或者是查不到之后去更新的,
定时任务刷新就有一个问题。
举个简单的例子:
如果所有首页的 Key 失效时间都是 12 小时,中午 12 点刷新 的,我零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓 存在可以扛住每秒 5000 个请求,但是缓存当时所有的 Key 都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能 DBA 都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这 个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。 这就是我理解的缓存雪崩。
我做过的项目感觉再吊的都不允许这么大的 QPS 直接打 DB 去, 不过没慢 SQL 加上分库,大表分表可能还还算能顶,但是跟用了 Redis 的差距还是很大

Redis雪崩.jpg

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

雪崩解决方案:
处理缓存雪崩简单,在批量往 Redis 存数据的时候,把每个 Key 的失效时间都 加个随机值就好了,这样可以保证数据不会在同一时间大面积失效,我相信, Redis 这点流量还是顶得住的。

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

如果 Redis 是集群部署,将热点数据均匀分布在不同的 Redis 库中也能避免全 部失效的问题,不过我在生产环境中操作集群的时候,单个服务都是对应的 单个 Redis 分片,是为了方便数据的管理,但是也同样有了可能会失效这样的弊 端,失效时间随机是个好策略。
或者设置热点数据永远不过期,有更新操作就更新缓存就好了(比如运维更新了 首页商品,那你刷下缓存就完事了,不要设置过期时间),电商首页的数据也可以用这个操作,保险。

缓存穿透和击穿

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


Redis穿透.jpg

小点的单机系统,基本上用 postman 就能搞死,比如我自己买的阿里云服务。像这种你如果不对参数做校验,数据库 id 都是大于 0 的,我一直用小于 0 的参数去请求你,每次都能绕开 Redis 直接打到数据库,数据库也查不到,每次都 这样,并发高点就容易崩掉了。

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

解决方案

缓存穿透我会在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参 数直接代码 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 集群都能抗 住这种级别的访问的,小公司我想他们不会感兴趣的。把系统的高可用做好了, 集群还是很能顶的。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容