1.Reids缓存雪崩
Redis缓存key同一时间大量失效,导致大量请求全部打到数据库,造成数据库挂掉
解决方案
设置缓存失效时间,随机初始化失效时间
部署集群的时候,把热点数据平均分布到不同redis节点上去
暴力方法,不设置失效时间,永远不失效
利用定时任务刷新缓存时间,在失效之前重新刷新失效时间
2.缓存穿透
数据库的主键是从0开始递增,没有负值。恶意用户利用这一点,不断用id小于0的参数给服务器发请求,redis就查不到这个缓存,redis中没有就会去数据库中找,找不到返回空值。恶意用户一直用id小于0的参数发送,就会一直直接穿透缓存,打在数据库上,导致数据库挂掉,
解决方案:
数据不论得到什么请求,是空值还是有值都缓存到redis中去,但是对方可能换参数,IP拉黑,但是可能换IP
判断参数的合法性,不合法return掉
布隆过滤器
3.缓存击穿
比如某秒杀商品放到reis缓存中,对应了一个key,只设置了很短的缓存失效时间,大量用户访问这个商品的时候都会到redis中访问该key,redis查询该缓存key并返回回去,突然这个缓存时间失效了,就把大量访问该key的数据打到数据库中,一般情况下,都是访问热点key,被击穿,打到数据库上,数据库挂掉
解决方案
缓存时间,不过期
分布式锁,互斥锁:给缓存找不到,请求数据库这一步上锁,那么这时候就只有一个线程能够抢到这个锁,也就是说只有一个线程到数据库找数据,数据库压力就小了,查到数据后,再把数据重新写到缓存中去,没抢到锁的向等待几秒