缓存击穿问题
问题产生原因:
key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端数据库加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端数据库压垮。
解决方案:
-
将热点数据生存时间去掉
-
使用缓存预热方案
(1) 可以换发出高并发请求,访问tomcat,tomcat访问redis,如果redis中不存在,返回null
(2) redis中的数据维护靠另一个系统,另一个系统只有管理员可以使用,管理员查询mysql的数据存入redis
缓存穿透问题
问题产生原因:
key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
解决方案:
-
如果mysql中不存在这样的数据,也存入redis中,此数据为垃圾数据,设置随机的超时时间
-
获取ip地址,添加访问限制。通过防火墙设置限制,限制多少秒内产生多少请求访问量
缓存雪崩问题
问题产生原因:
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案
将key的过期时间设置为某个区间内随机。这样数据就不会在同一时间大量过期,不会在同一时间造成大量数据库访问,防止数据库宕机
缓存倾斜问题
问题产生原因:
热点数据放到了一个redis基点上,导致redis基点无法承受住大量的请求,最终导致Redis宕机。
解决方案
- 扩展主从架构,搭建大量的从节点,缓解Redis的压力
- 可以在Tomcat中做JVM缓存,在查询Redis之前先去查询Tomcat的缓存