回答

收藏

记录:聊聊 redis 缓存的一些事

信息分享 信息分享 1628 人阅读 | 0 人回复 | 2020-06-10


https://mp.weixin.qq.com/s/LOCLXG_mzBVQeFrtM8srmA


缓存穿透:故意去请求缓存中不存在的数据,从而去数据库中查,数据库中也没有,所以无法加到缓存,下次还是直接怼到数据库,所以高并发的时候就导致数据库崩了。

解决方案:

1)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。

2)数据库没查到数据,也往缓存中写入一个空值,但是设置失效时间短一点,防止恶意攻击。

缓存雪崩:即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。

解决方案:

1)给缓存失效时间,加上一个随机值,避免大量缓存集体失效。

2)双缓存:缓存A和B,比如A的失效时间是20分钟,B不失效。比如从A中没读到,就去B中读,然后异步起一个线程同步到A。

3)也可以使用互斥锁,但是会影响性能,因为这个是业务场景,不是恶意攻击。

缓存击穿:是指一个key非常热点(类似于爆款),在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案:

可以将爆款的缓存失效时间设置为永久。



分享到:
回复

使用道具 举报