缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。
引发原因:1、用户请求的id在缓存中不存在;2、恶意用户伪造不存在的id发起请求(黑客攻击)
解决方案:
1、如果是非法请求,我们在API入口对参数进行校验,过滤非法值
2、如果查询数据库为空,我们可以先给缓存设置一个空值,如果有请求进来的话,可以保证缓存一致性,同时给缓存设置一个过期时间,
3、使用布隆过滤器快速判断数据是否存在,即一个查询请求过来的时候,先通过布隆过滤器判断值是否存在,如果存在,才能继续往下查。
缓存击穿:指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到数据库。和缓存雪崩很像,区别就是击穿是针对一个热点key,而缓存雪崩是针对大量key。
引发原因:热点key失效的时候,大量请求访问,导致数据库压力过大。
解决方案:
1、加锁,限制同一时刻只能有一个请求访问。
2、设置“永不过期”,或者不设置过期时间。
3、自动续期
缓存雪崩:指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接打到数据库上了,引发数据库压力过大造成宕机。
引发原因:大批量数据同时过期。
解决方案:
1、过期时间加随机数,避免大批量数据同时过期。
2、使用redis高可用集群
3、限流降级 加锁,设置某些key只能允许一个线程查询和缓存写入,其他线程等待,缓解大并发流量对数据库的打击。