Redis缓存穿透、缓存击穿、缓存雪崩
正常的一个缓存处理流程都会这样设计:请求数据 ,后段先从缓存中get数据,get到直接返回结果,get不到时从DB中取,DB取到更新缓存,并返回结果,DB也没取到,那直接返回空结果,流程见下图:
# 缓存穿透
缓存穿透是指查询一个一定不存在的数据,如果规则是从数据库中查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中查询,失去了缓存的意义,这也是经常提的缓存命中率问题。在流量大时,可能数据库就挂掉了,也可以利用不存在的key频繁攻击应用。
# 解决方案
- 如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,同时设置缓存时间;
- 在数据处理层,进行数据校验,判断数据类型和数据范围;
- 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力;
# 缓存雪崩
缓存雪崩是指由于大量原有缓存同时过期(或者数据未加载到缓存中),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机,造成系统的崩溃。
# 解决方案
- 缓存过期时间差异化,避免同一时间过期;
# 缓存击穿
缓存击穿是指某个设置了过期时间的热门key,在某个高并发访问的时间点过期,将会有多个数据查询请求同时发到数据库,对数据库CPU和内存造成冲击,严重的会造成数据库宕机,造成系统的崩溃。
缓存击穿和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
# 解决方案
- 热门key设置为永不过期,后台进行动态更新;
- 设置互斥锁:
上次更新: 2022/12/01, 11:09:34