缓存穿透、击穿、雪崩
原文:https://mp.weixin.qq.com/s/_sqGyTvMphOLPpbSCLh0Yw
总结,请求绕过redis,直接作用到mysql上
雪崩:key大面积失效(定时任务刷新缓存,key的过期时间相同,某个时间点全部失效)
解决方案:失效时间都加个随机值避免同一时间大面积失效
场景:app首页数据,所有首页的Key失效时间都是12小时,中午12点刷新的,我零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住
穿透:用户恶意使用不存在的key,则请求会到达数据库(如果这个用户并发一直请求就会。。)
解决方案:代码层做好数据效验
场景:使用不存在的用户id,如-1,请求接口
击穿:一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库
解决:将key设置成永不过期,或者自动续期
分布式锁(官方推荐redisson)
maven
<!-- https://mvnrepository.com/artifact/org.redisson/redisson --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.12.5</version> </dependency>
springboot项目
<!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.12.5</version> </dependency>
redisson官方中文文档
https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95