本文主要是介绍【redis】缓存雪崩、缓存穿透、缓存击穿,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、缓存雪崩
缓存雪崩是指缓存同一时间大面积失效,导致,后面的请求都落到数据库上,造成数据库短时间承受大量请求而崩掉。
解决方案:
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现在发生;
- 给每个缓存数据增加相应的缓存标记,记录缓存是否失效,如果缓存标记失效,则更新数据缓存。
- 缓存预热
- 互斥锁
2、缓存穿透
缓存击穿是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案:
- 在接口层增加校验,如:用户鉴权校验,id做基础校验,id<=0的直接拦截。
- 把无效的Key存进Redis中。如果Redis查不到数据,数据库也查不到,我们把这个Key值保存进Redis,设置value="null",当下次再通过这个Key查询时就不需要再查询数据库。这种处理方式肯定是有问题的,假如传进来的这个不存在的Key值每次都是随机的,那存进Redis也没有意。
- 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉。从而避免了对底层存储系统的查询压力。
3、缓存击穿
其实跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿
解决方案:
- 设置热点数据永不过期;
- 使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差
这篇关于【redis】缓存雪崩、缓存穿透、缓存击穿的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!