缓存击穿
1. 缓存击穿简述
某一个热点数据在缓存中失效,请求穿过redis到达DB,造成DB压力过大
2. 怎么解决缓存击穿
1. 使用redis 作为分布式互斥锁(mutex lock)
实现步骤:
- 多线程请求redis (请求为空,若不做处理会发生缓存击穿)
- 请求分布式锁 (使用方式可以参考https://www.cnblogs.com/zhixinSHOU/p/14562405.html)
- 抢到锁的查询数据库,刷新redis,没抢到锁的线程sleep
- sleep时间结束返回 1
注:使用分布式锁的时候必须设置过期时间,否则会有死锁的风险
2. 提前更新缓存
前提是缓存数据未失效,可以在获取的时候判断过期时间是否快要失效了,如果是则返回缓存数据的同时重新更新该值的过期时间,如果该数据已经过期了,那么还是需要采用第一种解决方式
缓存雪崩
1. 缓存雪崩简述
和缓存击穿类似,但是区别是在于缓存击穿是某一个热点数据失效,而缓存雪崩是针对某一批的热点数据同时失效
2. 怎么解决缓存雪崩
1. 使用redis 作为分布式互斥锁(mutex lock)
和缓存击穿的解决方式类似
2. 过期时间设置随机值
可以在原有的失效时间基础上增加一个随机值,让缓存的失效时间错开,就可以有效的避免缓存雪崩。