标题
1、缓存穿透
2、缓存雪崩
3、缓存击穿
故事
时间:任何时候
地点:工厂
人物:老板DB、工人Cache、社会人social(流氓、无业游民)
背景交代:db老板开了数据工厂,工人们每天工作就是帮老板搬砖给社会人看看,工资贼高待遇贼好,社会人羡慕工人同时砖头又很好”看“,所以每天都会去工厂看看,看看砖啊什么的。。。
1.缓存穿透
是指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数
据库也无此记录,我们没有将这次查询的null 写入缓存,这将导致这个不存在的数据每次
请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB 就挂掉了,要是有人利用不存在的key 频繁攻击我们的应用,这就是
漏洞。问题:
缓存和数据库都没有该数据,结果为null
解决:
缓存空结果、并且设置短的过期时间。
故事:
有一天,一个流氓来到工厂,说:“我要一个五彩斑斓的黑砖头”,其实他就是在捣乱的,工人们(key)人手上都没有这种“五彩斑斓的黑砖头”,只能去找DB老板,老板一下子就知道这个人是流氓来捣乱的,心想:“赶走一个流氓还会来下一个,这样也不是办法,要怎么解决呢”,过了一会,DB老板叫来一些工人,指着旁边的空地说:”把这些‘五彩斑斓的黑砖头’、‘五颜六色的白砖头’、‘姹紫嫣红的绿砖头’…搬出去给流氓看看要哪种“,工人们一头雾水,都怀疑DB老板是不是疯了,纷纷思考,过来一会,工人直呼”DB老板高明“。于是,工人们就拿着这些”皇帝的新砖头“去给流氓”观赏“。 从此,工厂厂史记录着:对付无理要求,我们可以无中生有
2、缓存雪崩
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失
效,请求全部转发到DB,DB 瞬时压力过重雪崩。解决:
原有的失效时间基础上增加一个随机值,比如1-5 分钟随机,这样每一个缓存的过期时间的
重复率就会降低,就很难引发集体失效的事件。
故事:
工人们工作很辛苦,到了月末的时候,都纷纷来DB面前拿工资,而且是那种拿不到工资(续约)不干活(搬砖)的那种,此时,DB老板一早醒来,发现自己们开口站着许多工人,等着开粮,顿时阳光明媚转乌云,DB老板忙了很久,累的半死半活,差点小命被夺走。晚上,DB老板躺在床上,想:”不行,这么累的活,我不能每个月都经历一次“。
第二天,老板就发了新的规定,工人除了基本工资外,每个月还有额外的红包,但是必须红包小的先来拿,大得隔天拿,再大的以此类推…后来,DB老板每天都会发一会工资而不会太累。
从此,工厂厂史记录着:工作应该每天都做,不要堆积到某个时刻, 不然奔溃就在一瞬间,不会总出现“一支笔,一个人,一个晚上,一个奇迹”的时候。
3、缓存击穿
对于一些设置了过期时间的key,如果这些key 可能会在某些时间点被超高并发地访问,
是一种非常“热点”的数据。这个时候,需要考虑一个问题:如果这个key 在大量请求同时进来前正好失效,那么所
有对这个key 的数据查询都落到db,我们称为缓存击穿。问题
缓存没有,数据库有,且是热点
解决:
加锁,对于第一个拿到锁的,顺便把缓存写了,后来的去访问缓存
故事:
有一天,一个工人到了领工资(时间续约)的时候,但该工人长得漂亮,算是明星,飘了,他觉得工资不算事,就不管合同,一只浪。等到夜晚降临,巨量社会人们不约而同都来看他,但发现看不到他(缓存里没有他),一些人(流氓)觉得可以取而代之,疯狂挤到DB老板那里索要合约当工人领高工资,DB老板发现不对劲,不做点什么估计会被冲掉,赶紧把门锁起来,并丢出一把钥匙,让社会人去抢,抢到的自然就可以和老板见面签合同,搬砖。后面的人就直接去找这个第一个人就行了。
从此,工厂厂史记录着:保护好自己,让别人抢去。