1、缓存穿透
-
概念
-
查询一个数据,缓存中没有,数据库中也没有,当这种空数据过多时,都去请求了持久层数据库
-
-
代价
-
给数据库造成很大的压力
-
-
解决方案
-
1、布隆过滤器
-
一种数据结构,对所有可能查询的参数以Hash形式储存在控制层先进行校验,不符合就丢弃,从而避免了对底层存储系统的查询压力
-
-
2、缓存空对象
-
当存储层不命中后,即使返回的空对象也将其存储起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源
-
存在问题
-
存储大量空值对缓存空间有影响
-
即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间的不一致,对数据的一致性会有影响
-
-
-
2、缓存击穿
-
概念
-
一个key非常热点,不停的扛着大并发,当这个key在失效的瞬间,持续的大并发就会穿破缓存,直接请求数据库
-
-
代价
-
缓存过期,会同时访问数据库来查询最新数据库,并且回写缓存,会导致数据库瞬间压力过大
-
-
解决方案
-
1、设置热点数据永不过期
-
2、加互斥锁
-
使用分布式锁,保证对于每个Key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可
-
这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大
-
-
3、缓存雪崩
-
概念
-
在某个时间段,缓存集中过期失效
-
-
代价
-
数据库服务器有可能会宕机
-
-
解决方案
-
1、Redis高可用
-
搭建Redis集群
-
-
2、限流降级
-
在缓存失效时,通过加锁或者队列来控制数据库写缓存的线程数量
-
-
3、数据预热
-
在正式部署之前,把可能的数据预先访问一遍,这样大量访问的数据就会加载到缓存中,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
-
-