缓存击穿
缓存击穿:高并发场景下,缓存的key过期,造成大量请求直接打到DB。
方案:
- key过期后,第一个请求过来发现key过期,直接获取锁,获取到锁的连接访问db,再缓存key到redis。未获取到锁的连接随机sleep,然后从reids再读取key。
- 这样会有一个问题,第一个连接在获取到锁后读取db时连接挂了,怎么办?(redis锁加过期时间)
- 假如第一个连接没挂,但是锁超时了,他还没从db读取完数据缓存到redis。这时其他连接sleep完继续访问db,怎么办? 第一个连接读取db时采用2个线程,一个线程读取db,另一个线程查看redis在过期时间内是否已经缓存完数据,没缓存完的话增加锁的失效时间。
缓存穿透
缓存穿透:客户端查询的是本系统根本不存在的数据,这样大量请求直接打到DB。
方案:
- 布隆过滤器 :有一个弊端,数据只能增加不可删除
- 布谷鸟过滤器:支持删除
缓存雪崩
缓存雪崩:大量的key同时失效,造成瞬间大量请求访问DB
方案:
- 时点性无关:缓存key随机过期时间
- 零点:有些场景下,在零点切日的时候,咱们会更新全量key到redis。这个时候强依赖 击穿方案。