缓存三大问题:雪崩击穿穿透

总的来说,这三个问题都是因为高并发导致的

雪崩:

那么雪崩就是因为海量请求,导致缓存宕机,然后间接导致数据库和程序代码都崩坏。总结:导致程序中的各个环节连锁崩溃,就是雪崩。

java 透传的参数应该放在哪个模块 java穿透问题_开发语言

那么解决的方法,就是比如说在我们的网关做限流,或者熔断,或者使用别的方法进行多级缓存,比如nginx

 

java 透传的参数应该放在哪个模块 java穿透问题_java 透传的参数应该放在哪个模块_02

 

java 透传的参数应该放在哪个模块 java穿透问题_数据库_03

 

击穿:

关键词就是单点,这个就是针对单个功能进行多次请求,比如双十一,或者12306这种会在瞬间有多次请求,那么缓存正好在这个时间点,过期了,导致本来应该缓存处理的请求,直接到了数据库的层面,直接将数据库冲垮了,就是我们的击穿。

解决办法呢:也是可以通过多级缓存解决的,或者不给缓存设置过期时间

 

穿透:

访问数据库中不存在的key,.乱臣贼子非得访问不存在的key,还疯狂访问,缓存中不存在,然后就去数据库查嘛,你查一次不行,你还疯狂的查,你短时间的多次请求,甚至直接做个程序去请求,导致直接把数据库冲垮了,这就是穿透

java 透传的参数应该放在哪个模块 java穿透问题_缓存_04

解决办法呢:这里有个东东叫做布隆过滤器,基于布隆算法,它可以快速匹配某个key是否存在数据库,请求过来会先到布隆过滤器中,查询到这个key不存在就直接返回了,就不会到数据库了。

 

java 透传的参数应该放在哪个模块 java穿透问题_数据库_05

 

布隆过滤器:

其中的数据结构是bitmap

那么它是怎么快速查询的呢,比如要查询存不存在study这个key ,他会进行多次哈希,得到多个哈希值,那么就会在bitmap的对应位置标记为某个数值比如是1  ,那么在请求的时候,就把传入进来的参数也进行相同的哈希,然后去找对应的位置,看看是不是同时为1,如果同时为1 就代表存在,反之不存在

java 透传的参数应该放在哪个模块 java穿透问题_java_06

 

那么这个查询方法,也就是布隆算法怎么就快了呢,它的时间复杂度是O1。所以快。那么用到了哈希算法,那么就避免不了一个问题,那就是哈希冲突,或者叫做哈希碰撞。那么解决的办法就是 增加哈希次数,或者增加哈希难度,复杂度,降低重复的概率。

时间复杂度

这里说一下时间复杂度O1的意思就是不管你数据结构长度为多少,那么我的耗费时间都是一样的,那么什么是On呢,On就是耗费的时间跟着数据结构的长度走,数据结构长,耗费时间也长。