Redis如何解决缓存击穿问题
1、什么是缓存击穿
缓存击穿是指在一个高并发的系统中,某个热点数据过期导致的短时间大量请求命中数据库,导致数据库崩溃。
2、解决方案一:分布式锁
也就是加上互斥锁
当请求查询缓存,发现缓存不存在需要去数据库获取数据的时候,请求需要获取到一把互斥锁,也就是只能有一个请求能到数据库查询,其他请求都将被阻塞。
缺点:这种加互斥锁的方案有一个弊端就是,所有获取到锁的请求,也就是在没有缓存的时候的请求都会重新查一遍数据库。
3、解决方案二:双重判定锁
针对上述加锁的方案进行优化,我们可以在获取锁之前判断是否有缓存,然后再获取到锁之后再进行判断是否有缓存即可。这样获取到锁的请求也都将落到缓存上。
流程如下:
- 请求获取缓存,缓存未命中,获取互斥锁(只能有一个请求获取到,其他请求阻塞等待获取锁)
- 获取到锁的请求再判断缓存是否存在,未命中查询数据库,并且重建缓存
- 其他请求轮流获取到锁,然后判断是否存在缓存,缓存命中返回。
4、解决方案三:数据永不过期
对于很多热门 key,其实是可以不用设置过期时间,让其永久有效的。
比如参与秒杀活动的热门商品,由于这类商品id并不多,在缓存中我们可以不设置过期时间。
在秒杀活动开始前,我们先用一个程序提前从数据库中查询出商品的数据,然后同步到缓存中,提前做预热
。
等秒杀活动结束一段时间之后,我们再手动删除
这些无用的缓存即可。