前言
实际运用场景中,经常遇到高并发,尤其在秒杀、热点数据,某一时刻产生大量并发请求,如果直接请求数据库,会造成数据库瘫痪,造成整个服务不可用,为了避免这种情况发生,经常用到缓存技术,来缓冲高并发请求。
引入缓存技术,能够缓解数据库压力,提供系统性能,系统更加健壮。但是同时缓存技术会引发缓存穿透、击穿、雪崩,这些情况需要提前考虑好,做好防护。以redis 为例,讲解下如何发生的,该如何处理
缓存击穿
- 概念
某一瞬时大批量请求集中访问一个key(上百上千万请求), 如果此时缓存过期失效,
缓存中数据不存在, 数据库存在
,所有请求瞬间集中到数据库,会造成数据库瘫痪,这就是内存击穿
- 解决方法
- 设置热点数据永不过期
- 添加互斥锁:枷锁之后,保证每一个key,只有一个线程去执行,其他线程等待。
缓存穿透
- 概念
请求的数据在内存不存在,去数据库查询,查到写入缓存。如果数据库中也不存在,无法写入缓存,其他请求会继续去数据库查询,这就是缓存穿透。总结起来就一话:
缓存和数据库都没有数据
- 解决方案
使用布隆过滤器布隆过滤器
缓存雪崩
- 概念
某一时刻缓存集群失效,如reds 挂了,造成缓存雪崩。雪崩后果很严重
- 解决方案
- Redis的高可用。 redis可能挂掉,这个时候第一保证高可用。
- 限流降级,缓存失效后的处理,(加锁,返回预定的对象)
- 数据预热, 在正式的部署之前,先将这批数据放入到redis缓存中,假设即将发生高并发的情况,这个时候设置不同的过期时间。保证部分节点可用
- 在进行redis数据写入时引入sync同步代码块(并发写请求个数=该业务的集群节点数)