关于击穿、穿透和雪崩你真的了解麽?
相信你看完了以下我的介绍,会有所了解...
击穿
通俗的说击穿:前提是对某一key发生了高并发至redis,恰巧那么一瞬间key消失(过期时间/LRU/LFU),此时key的消失造成并发访问DB。
先上图,一张图抵过1万句废话,呵呵;-)
击穿图解:
由于redis是单线程的,即使高并发请求过来,那也得一个个处理,总有个先进来的请求。请求过程分为->1,get key ,发现key不存在;2,分布式锁setnx,对该key加锁;3-1,然后去查db,查到数据,set k v; 3-2, 于此同时其他请求到达后,同样是否可以setnx成功? false时,sleep xs, sleep结束后再get key;上述看似完美,其实有个问题:如果第一个人在3-1阶段挂了呢?这样就进入无限循环了。
怎么解决呢?答: 给setnx 设置锁的过期时间。
上述又看似问题解决,其实又有别的问题来了,第一个人没挂,但是锁超时了。那么后面的请求跟第一个人一样了,就乱了。
怎么解决呢? 答:上多线程,一个去查db,一个监控是否设置值,没有则延长锁过期时间。
穿透
通俗的说穿透:从业务接收查询的,是系统根本不存在的数据,即redis中没有,db中也没有,这样请求就直接打到db
还是先上图;-)
穿透图解:
加上布隆过滤器。前面的章节已经介绍过布隆过滤器;-)
雪崩
通俗的说穿透:大量的key同事失效,间接造成大量的访问打到db
依然是先上图;-)
雪崩图解:
分两种场景来解决雪崩,时点无关的数据,采用随机设置过期时间;时点有关的数据,强依赖击穿解决方案(也可业务层加判断做延时)
补充->>时点有效数据是啥意思? 答:0点前一种优惠力度,0点后另一种优惠力度
————————————————————
坐标帝都,白天上班族,晚上是知识的分享者
如果读完觉得有收获的话,欢迎点赞加关注