缓存存在的问题

缓存穿透

是什么

  • **高并发**情况下或是**恶意请求**的情况下,大量的请求**缓存中不存在的数据**,因为缓存中不存在对应的数据,因此所有的请求都会到数据库中请求,导致数据库的压力过大。

如何解决

  1. **校验参数**的合法性,对于不符合要求的参数直接进行拦截,避免请求缓存和数据库
  2. **缓存空值**,在一个请求查询到数据库中没有数据后,在一定时间内其他请求查询到**缓存中为空值**,则不会到数据库中进行查询。但如果遇到**恶意请求**,例如查询**大范围的参数**,可能会导致Redis中**存储大量空值**,则会占用缓存**大量空间**,并且仍然会**频繁查找数据库**
  3. 出现缓存穿透问题时一般为**非法的用户**,对于一个IP多次查询到空值,则对**IP进行限制访问**
  4. 布隆过滤器 https://www.yuque.com/yuqueyonghudhnost/wc1dk2/rv6ow4zi1v69pg7g

缓存击穿

是什么

**热点Key**的缓存失效后,缓存中没有对应的数据,会去访问数据库的数据后,将数据插入到缓存中,此时会有大量的请求到数据中

如何解决

架构方面
  • 数据库做**高可用架构**,搭建主从或集群,在这种架构下,已经能够**承受一定的并发**,在绝大多数情况下不会宕机。
  • 如果是**定时秒杀**等场景,请求量很大,库存的缓存需要**相关的监控**,尽早的发现问题介入处理
  • **请求量过大**的情况下,除了数据库会扛不住,缓存也可能扛不住,因此处理问题的本质在于服务在**高并发情况下的处理方式**,因此更重要的是在于**限流、熔断、降级策略**,保证服务的可用。
缓存方面
  • 在解决完**架构方面**的问题后,才考虑解决缓存方面的问题
  • 在缓存中没有对应的数据时,查询数据库前**先获取分布式锁**,保证只有**第一个**去查询的线程能获取到锁,从而去数据库中进行数据库的查询。在其他线程获取到锁后,**先判断缓存中是否已经存在数据**,防止其他线程在获取到锁后再次查询数据库。
  • 对于热点且变化较少的数据可以**不设置过期时间**,再通过后台线程**定时查询数据库**进行更新。

缓存雪崩

什么是缓存雪崩

多个热点Key同时过期,导致同时去访问数据库,大量请求导致数据库崩溃

缓存雪崩怎么解决

  1. 对于Key的过期时间的设置设定不同的过期时间,可以在一个时间的基础之上添加额外的随机过期时间。
  2. 对于机器做高可用配置,使用集群或其他方式进行部署。
  3. 引入本地缓存,减少对Redis的访问压力
  4. 引入全局挡板,如果有多次Redis查询失败的异常则设置全局开关开启,返回配置中心中的默认数据(等等再来),此时同时开启一个线程定期去Redis中查询数据,如果在一定时间内能有多次返回正常的数据,则关闭全局开关。

冷启动

什么是冷启动

系统刚刚启动,此时Redis中没有任何缓存,导致大量请求直接打到数据库。

如何解决冷启动问题

在程序启动后,通过实现InitializingBean接口,提前对通过大数据计算出的热门数据添加到Redis缓存中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值