如何解决缓存击穿缓存穿透(缓存-缓存穿透)
如何解决缓存击穿缓存穿透(缓存-缓存穿透)描述:一个热点key,在缓存过期/失效的瞬间,可能会有大量并发的请求走到db,db访问陡增,甚至被打挂解决方案:引入缓存之后的架构引入缓存后,常见的问题如下:描述:当访问一个在缓存和db中都不存在的数据时,此时缓存不起作用,大量的请求会直接访问到db,可能会把db打挂
为什么需要引入缓存在高并发场景中,后端组件(常见的是mysql)不能直接支持高并发的请求,如果把所有的请求都打到后端组件上,可能会导致服务器崩溃,影响系统稳定性,所以引入了缓存
引入缓存之前的架构
引入缓存之前的架构
引入缓存之后的架构
引入缓存之后的架构
引入缓存后的问题引入缓存后,常见的问题如下:
- 缓存穿透
- 缓存击穿
- 缓存雪崩
描述:当访问一个在缓存和db中都不存在的数据时,此时缓存不起作用,大量的请求会直接访问到db,可能会把db打挂
解决方案:
- 业务层校验。业务层增加校验逻辑,拦截一些非法的请求
- 缓存空对象。查询db后,得到的数据是空,此时也存入缓存,避免短时间内重复请求db
- 布隆过滤器。把db里面的数据全量放到布隆过滤器中,每次访问db之前,先通过布隆过滤器来判断数据是否存在,若不存在,则不访问db
描述:一个热点key,在缓存过期/失效的瞬间,可能会有大量并发的请求走到db,db访问陡增,甚至被打挂
解决方案:
- 加互斥锁。保证同一个key,只有一个请求访问到db
- 热点数据永不过期。通过其他的方式来更新热点数据,比如定时任务等
- singleflight
描述:大量的缓存数据,在同一时间过期/失效,导致大量的请求走到db,db访问陡增,甚至被打挂
与缓存击穿的区别:缓存击穿强调的是一个key,缓存雪崩强调的是大量的key
解决方案:
- 过期时间打散。随机生成key的过期时间,避免同一时间大量的缓存过期/失效
- 加互斥锁。保证同一个key,只有一个请求访问到db
- 热点数据永不过期。通过其他的方式来更新热点数据,比如定时任务等
- singleflight