缓存穿透
是什么
- 在
**高并发**
情况下或是**恶意请求**
的情况下,大量的请求**缓存中不存在的数据**
,因为缓存中不存在对应的数据,因此所有的请求都会到数据库中请求,导致数据库的压力过大。
如何解决
**校验参数**
的合法性,对于不符合要求的参数直接进行拦截,避免请求缓存和数据库**缓存空值**
,在一个请求查询到数据库中没有数据后,在一定时间内其他请求查询到**缓存中为空值**
,则不会到数据库中进行查询。但如果遇到**恶意请求**
,例如查询**大范围的参数**
,可能会导致Redis中**存储大量空值**
,则会占用缓存**大量空间**
,并且仍然会**频繁查找数据库**
。- 出现缓存穿透问题时一般为
**非法的用户**
,对于一个IP多次查询到空值,则对**IP进行限制访问**
- 布隆过滤器 https://www.yuque.com/yuqueyonghudhnost/wc1dk2/rv6ow4zi1v69pg7g
缓存击穿
是什么
当**热点Key**
的缓存失效后,缓存中没有对应的数据,会去访问数据库的数据后,将数据插入到缓存中,此时会有大量的请求到数据中
如何解决
架构方面
- 数据库做
**高可用架构**
,搭建主从或集群,在这种架构下,已经能够**承受一定的并发**
,在绝大多数情况下不会宕机。 - 如果是
**定时秒杀**
等场景,请求量很大,库存的缓存需要**相关的监控**
,尽早的发现问题介入处理 - 在
**请求量过大**
的情况下,除了数据库会扛不住,缓存也可能扛不住,因此处理问题的本质在于服务在**高并发情况下的处理方式**
,因此更重要的是在于**限流、熔断、降级策略**
,保证服务的可用。
缓存方面
- 在解决完
**架构方面**
的问题后,才考虑解决缓存方面的问题 - 在缓存中没有对应的数据时,查询数据库前
**先获取分布式锁**
,保证只有**第一个**
去查询的线程能获取到锁,从而去数据库中进行数据库的查询。在其他线程获取到锁后,**先判断缓存中是否已经存在数据**
,防止其他线程在获取到锁后再次查询数据库。 - 对于热点且变化较少的数据可以
**不设置过期时间**
,再通过后台线程**定时查询数据库**
进行更新。
缓存雪崩
什么是缓存雪崩
多个热点Key同时过期,导致同时去访问数据库,大量请求导致数据库崩溃
缓存雪崩怎么解决
- 对于Key的过期时间的设置设定不同的过期时间,可以在一个时间的基础之上添加额外的随机过期时间。
- 对于机器做高可用配置,使用集群或其他方式进行部署。
- 引入本地缓存,减少对Redis的访问压力
- 引入全局挡板,如果有多次Redis查询失败的异常则设置全局开关开启,返回配置中心中的默认数据(等等再来),此时同时开启一个线程定期去Redis中查询数据,如果在一定时间内能有多次返回正常的数据,则关闭全局开关。
冷启动
什么是冷启动
系统刚刚启动,此时Redis中没有任何缓存,导致大量请求直接打到数据库。
如何解决冷启动问题
在程序启动后,通过实现InitializingBean接口,提前对通过大数据计算出的热门数据添加到Redis缓存中。