缓存穿透
概念
缓存穿透是指用户大量请求缓存、数据库没有的数据,导致没有办法更新缓存,每一次的请求都会到数据库上,导致数据库压力过大
解决方案
-
接口校验
在接口对鉴权、数据合法性进行校验,这往往事考虑出现恶意攻击的情况
-
缓存空值
将空数据写入到缓存之中,下次就会直接获取缓存的内容
-
布隆过滤器
布隆过滤器存储所有可能访问的 key,不存在的 key 直接被过滤,存在的 key 则再进一步查询缓存和数据库
缓存击穿
概念
缓存击穿是指缓存中没有但数据库中有的数据,在缓存当中常常没读到数据而去数据库取数据引起数据库压力过大,这种情况通常是因为缓存内容过期导致
解决方案
-
加互斥锁
加锁的意义就在与每一次都只会有一个请求线程到数据库获取进行查询,但是也可以做取舍,例如:单台服务器的话完全可是使用JVM层级的锁,多台服务器就需要考虑分布式锁(Redis锁/Zookeeper锁)了
-
热点数据设置不过期
直接将热点数据设置不过期是最简单粗暴的方式,需要考虑异常处理与刷新时间间隔,否则会一直获取不到最新的数据
缓存雪崩
概念
缓存中数据大批量到过期时间,同时大量请求直接到数据库,引起数据库压力过大
与缓存击穿的区别
缓存击穿是单条数据,缓存雪崩是多条数据同时过期
解决方案
-
过期时间打散
通过给缓存过期时间加上一个随机值的方式,使得不在同一时间过期
-
热点数据不过期
直接将热点数据设置不过期是最简单粗暴的方式,需要考虑异常处理与刷新时间间隔,否则会一直获取不到最新的数据
-
加互斥锁
加锁的意义就在与每一次都只会有一个请求线程到数据库获取进行查询,但是也可以做取舍,例如:单台服务器的话完全可是使用JVM层级的锁,多台服务器就需要考虑分布式锁(Redis锁/Zookeeper锁)了
-
。