穿透
缓存穿透是指请求一个不存在的数据,缓存层和数据库层都没有这个数据,这种请求会穿透缓存直接到数据库进行查询。它通常发生在一些恶意用户可能故意发起不存在的请求,试图让系统陷入这种情况,以耗尽数据库连接资源或者造成性能问题。
解决方法
1 查一个不存在的数据时,给一个设置一定过期间的key的数据,存入缓存--- 简单粗暴
2添加布隆过滤器:原理:先把缓存中的数据的key存入到布隆过滤器中 查询缓存前,先判断当前key在布隆过滤器中是否存在
布隆过滤器的工作原理
1、在将数据存入Redis时,会同时存储一个Redis的键到布隆过滤器中
2会通过布隆过滤器提供的多个Hash函数对Key进行Hash运算,再对位数组长度进行取余,得到一个下标,将该下标值设置为1
3、在查询时,会先按存储Redis到布隆过滤器中的方法,去判断当前的Key是否在布隆过滤器中,结果有两种
一定不存在【位数组对应的下标上有一个或多个是0】,直接返回
有可能存在【位数组对应的下标上每个对应值都1】,查Redis
项目中对没有查询到数据的请求我们缓存了空值避免缓存穿透,具体实现是使用的Spring Cache,使用Cacheable注解标记在service方法,并通过unless指定条件,根据返回值去控制缓存过期时间,正常的数据我们设置了永不过期,我们会有一个定时任务去更新这部分的缓存,对空列表数据为防止缓存穿透我们缓存了空值,缓存过期时间是30分钟。
击穿
缓存击穿发生在访问热点数据,大量请求访问同一个热点数据,当热点数据失效后同时去请求数据库,瞬间耗尽数据库资源,导致数据库无法使用。
解决方法
1、使用同步锁或分布式锁控制。
2、热点数据永不过期。
3、缓存预热,分为提前预热、定时预热
4、降级处理
雪崩
缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。
解决方案
1分布式锁
2、热点数据永不过期
3、key随机过期时间