当前位置: 首页 > news >正文

缓存存在的问题

文章目录

  • 缓存问题
    • 缓存穿透
      • 引入
      • 解决方案
    • 缓存雪崩
    • 缓存击穿

缓存问题

使用缓存时常见的问题主要分为三个:缓存穿透缓存雪崩缓存击穿

下面对其进行一一学习

缓存穿透

引入

定义:缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样的缓存永远不会生效,这些请求都会打到数据库。

image-20230514152519575

导致缓存击穿的原因是,当用户使用不存在的请求访问缓存的时候,因为缓存中不存在数据,则会将请求打到数据库,然后数据库也没有相关请求的数据,则只能给用户端报错或返回空值。一次这样无效的请求服务器还应对的过来,然而当一些(不怀好意的)人使用大量这种无效的请求访问时,则会全部打到数据库,导致数据库宕机,或者拖慢其他正确请求的访问。

那么,如何应对这种问题呢?

解决方案

常见的解决缓存击穿的方案有以下几种:

  1. 缓存空对象:当一个无效请求打到数据库查询无效时,将此次请求进行缓存,并赋予null值

    image-20230514153846161

    • 优点:实现简单,维护方便
    • 缺点:① 额外的内存消耗 ② 可能造成短期的不一致
  2. 布隆过滤

    image-20230514162707886

    • 优点:内存占用较少,没有多余key
    • 缺点:① 实现复杂 ② 存在误判可能
  3. 增强id的复杂度

  4. 做好数据的基础格式校验

  5. 加强用户权限校验

缓存雪崩

定义:缓存雪崩是指在同一时间段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

image-20230514171339528

通常的解决方案有以下四种:

  1. 给不同的Key的TTL添加随机值(防止大量TTL同时到期)
  2. 利用Redis集群提高服务的可用性
  3. 给缓存业务添加降级限流策略
  4. 给业务添加多级缓存

缓存击穿

定义:缓存击穿问题也叫热点问题,就是一个被高并发访问缓存重建业务较复杂的Key突然失效,无数的请求访问会在瞬间给数据库带来巨大的冲击。

image-20230514172958892

常见的解决方案有两种:

  1. 互斥锁(保证一致性)

    image-20230514173253317

    • 优点:① 没有额外的内存消耗 ② 保证一致性 ③ 实现简单
    • 缺点:① 线程需要等待,性能受到影响 ② 可能有死锁风险
  2. 逻辑过期(保证可用性)

    image-20230514173739158

    • 优点: 线程无需等待,性能较好
    • 缺点:① 不保证一致性 ② 有额外内存消耗 ③ 实现复杂
http://www.lryc.cn/news/70389.html

相关文章:

  • ChatGPT 的 AskYourPDF 插件所需链接如何获取?
  • 基于自营配送模式的车辆路径规划设计与实现_kaic
  • 动态规划-树形DP
  • 多线程基础(二)CAS无锁优化/自旋锁/乐观锁、ABA问题
  • 记ABAC的落地实践
  • 【C++】C++11线程库 和 C++IO流
  • cpp11实现线程池(六)——线程池任务返回值类型Result实现
  • 道岔外锁闭装置介绍
  • idea把项目上传到码云
  • 设计模式之责任链模式
  • Python--我一般都用这个模块压缩文件
  • Chapter8 :Physical Constraints(ug903)
  • 星标3.5k,一款国产的轻量级开源在线项目任务管理工具
  • 【华为OD机试真题2023B卷 JAVA】字符串摘要
  • Java线程概述 (一)线程介绍
  • 操作系统第三章——存储系统(下)
  • 初识结构体
  • 协程并发下数据汇总:除了互斥锁,还有其他方式吗?
  • 5、Ray-Actor模型和并发编程
  • HNU-电路与电子学-小班2
  • 二分图匹配算法
  • 虹科技术 | 虹科EtherCAT增量编码器输入模块数据采集实操测试
  • 2023.05.21 学习周报
  • 资深程序员深度体验ChatGPT一周发现竟然....
  • 带你深入了解Android Handler的用法
  • 生于零售的亚马逊云科技,如何加速中国跨境电商企业出海?
  • 兄弟组件传值$on无法接收值
  • Spring事务及事务传播机制
  • npm i 常见问题
  • Prometheus+Grafana监控系统