1 穿透: 两边都不存在(皇帝的新装)
——简介:缓存穿透指的是恶意用户或攻击者通过请求不存在于缓存和后端存储中的数据来使得所有请求都落到后端存储上,导致系统瘫痪。
——详述:(缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。)
解决方法:设置黑名单,(黑名单机制:在特定场景下,维护一个可能存在或不存在的数据列表,对查询请求进行过滤。【常用】)
使用布隆过滤器,(缺点:会出现误删;有一定的误判率;由于错误率影响hash函数的数量,当hash函数越多,每次插入、查询需做的hash操作就越多)
2 击穿:一个热点的key失效了,这时大量的并发请求直接到达数据库.
——简介:缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
解决方法:提前预热:缓存预热是指在系统启动或者高峰期之前,提前将数据加载到缓存中,避免在用户请求的时候,先查询数据库(这样第一个查询的人就会比较慢),再把查询结果回写到redis当中去。
3 雪崩:大量key同时失效
——简介:缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
解决方法:避免缓存失效时间集中(错峰):常用且易于实现通过使用自动生成随机数使得key的过期时间TTL是随机的,防止集体过期。或者设置缓存标记,即热点数据可以不考虑失效,后台异步更新缓存,适用于不严格要求缓存一致性的情景。