一、正常的缓存处理流程
二、什么是缓存雪崩和缓存穿透
缓存雪崩:指的是缓存中大量数据到达过期时间或者没有此数据,而数据查询量过大,导致数据库压力过大而宕机的情形。
缓存穿透:指的是查询了很多缓存和数据库中都没有的数据,而用户不断的发起请求,比如id为“-1”,“999”,用户很有可能是黑客,数据查询量多大导致数据库压力过大而宕机的情形。
二、如何解决缓存雪崩问题
1.分析造成缓存雪崩的原因:
(1) 单位时间内请求数过多
(2)redis服务宕机,不可用
(3)大量数据同时到达过期时间,导致缓存内查不到此数据
2.解决方案
事前: (1)保证redis高可用,主从+哨兵,分布式部署使热点数据均匀分布在不同的缓存数据库中,
(2)设置热点数据过期时间随机,防止同一时间大量数据过期现象发生
(3)设置热点数据永不过期
事中: 本地ehcache缓存,hystrix限流&降级,避免MySQL数据库宕机
事后: redis持久化,快速恢复缓存数据
流程图:
三、如何解决缓存穿透问题
1.分析造成缓存穿透原因:
(1)缓存和数据库中压根不存在此数据
(2)单位时间内,此数据大量访问数据库,很有可能是黑客攻击,导致数据库宕机
2.解决方案
(1)接口层增加校验,如遇到格式不正确,或者参数非法,如“-1”,“999”等,直接拦截。
(2)将查询不到的数据,写入缓存中,如key-UNKNOWN,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
流程图