缓存雪崩
雪崩的时候没有一片雪花是无辜的->
1)缓存雪崩是在某一瞬间,缓存数据设置的过期时间大致相同,导致大量的缓存失效,这时候大量请求进来,导致数据库压力太大(很多文章拿秒杀作为例子),导致其他正常的业务处理,造成了缓存雪崩;
2)缓存服务器宕机,导致缓存用不了
在实际开发过程中,预防雪崩:
1)设置缓存时间的随机性,让缓存数据不会在某个时间点集中失效
2)拿redis缓存来说,做redis集群处理
3)设置热点数据永不过期
4)当雪崩产生,针对非核心请求,可以做熔断来处理(在微服务开发中使用的Hystrix)。针对核心请求,允许访问数据库;
缓存击穿
击穿就个人理解,应该算是雪崩的一种情况;
1)在某一刻某个热点数据失效,大量请求进来,缓存取不到直接在数据库进行取值,导致数据库压力太大
实际开发中,对于热点数据,一般都设置永不过期,不允许删除热点数据的缓存,只允许更新
缓存穿透
穿透来说,就是数据既不存在于缓存又不存在于数据库,特别针对恶意攻击,不断请求缓存和数据库不存在的数据库,每次都去数据库查询(一般对于缓存不存在,但是数据库查询到的,会写入缓存,方便下一次请求可以走缓存),导致数据库压力暴增
1)养成良好的编码习惯,在接口入参增加valid注解校验入参
2)恶意攻击者过来的数据进行缓存空置和缺省值(该方案是大多数博客都会提到的一个方案,在实际开发中使用的缓存处理,好像并没有这么做)
3)使用布隆过滤器,本质上是布隆过滤器会标记写入到数据库的数据
布隆过滤器实现逻辑:
1)对想要标记的数据,使用哈希函数计算出哈希值
2)对得到的哈希值进行bit数据的长度取模,获取每个哈希值在数组的对应位置
3)把对应位置的bit位设置为1