前言
通常在业务中使用的缓存流程基:
- 前端请求后台
- 先从缓存中取数据
- 取不到数据后,从数据库去查数据,并缓存起来返回数据
- 如果取不到就返回空结果
1.缓存穿透
指的是缓存和数据库都没有的数据,而用户不断的发起请求,比如发一个负数id去请求后端,每次都会去查下游数据库,这样并发量多的话,就会导致数据库压力过大。
解决方案:
- 1.在接口处进行校验
- 2.缓存取不到的数据为空,并设置较短的过期时间,可以减少攻击
- 3.使用布隆过滤器
2.缓存击穿
一般我们会对缓存的key设置过期时间,在高并发下,如果在某一时刻这个key刚好过期,此时持续的大并发请求都会穿破缓存,直接访问下游数据库,造成下游数据库的压力瞬间变大
解决方案:
- 通过分布式锁或者队列,使得同一个key只允许一个线程到数据库查询
- 定时预先更新缓存,避免发生缓存失效的情形
3.缓存雪崩
就是在某个时候,缓存中的大量key失效,在高并发的情况下,会直接访问到下游数据库,这样就使得下游数据库的压力瞬间变大
解决方案:
1.不同的key使用不同的时间来过期数据,
2.设置缓存永不过期
3.定时设定