缓存雪崩:
大量redis缓存在同一时间全部失效,导致大量请求全部打到数据库,导致数据库挂掉
解决方案:设置缓存的失效时间,让其不要在同一时间失效,而是随机初始化其失效时间。对于热点key,redis一般是集群部署,把这些热点key放到不同节点上,让这些热点缓存平均分布在不同redis缓存节点上,或者设置热点key永久不失效(很暴力)
缓存穿透:
是指缓存和数据库中都没有的数据,一般常见于黑客攻击。比如用请求id = -1的数据,这种数据直接穿透缓存打到数据库上,导致数据库挂掉
解决方案:
- 当请求穿透redis直接到数据库,数据库无论查出什么结果(空或者有值)都会缓存到redis里去,下次对方用同一个参数发送请求时,就不会穿透redis
- 但是下一次可能会换不同的参数,可以直接将此ip拉黑
- 对方也可能换不同的ip,对参数的合法性进行校验,再判断这个参数不合法时,直接return掉
- 使用布隆过滤器
缓存击穿:
大量用户请求去不断访问某一热点key,当这个热点key突然失效,把请求打到数据库上,这个过程叫做击穿
解决方案:使用分布式锁
使用互斥锁,大量用户去访问redis请求数据,如果redis里的数据为空的话,他就会请求数据库,那么在请求数据库这一步给他上锁,这时只有一个线程能抢到这个锁,也就只有一个线程能操作这个数据库,当他查询到数据库时就把缓存重新写到这个redis里去,那么其他线程就不能到数据库查询数据,也不用再竞争分布式锁,直接在redis就返回了
雪崩针对的是大量商品总共的访问请求次数
击穿是大量用户对同一商品的请求次数