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

缓存穿透、缓存击穿、缓存雪崩的区别是什么?

目录

缓存穿透、缓存击穿、缓存雪崩

1、缓存穿透

解决方案

2、缓存击穿

解决方案

请求过程

3、缓存雪崩

解决方案

请求过程


缓存穿透、缓存击穿、缓存雪崩

1、缓存穿透

缓存穿透是指当大量请求未命中缓存,直接请求后端数据库(可能是业务代码的缺陷或恶意攻击),而后端数据库也未能查询到相应记录,从而无法添加缓存。这会导致流量持续打到存储层,无法有效利用缓存,同时给存储层带来巨大压力。

解决方案
  1. 添加空对象到缓存:当请求未命中缓存且数据库记录为空时,可以在缓存中添加该 key 的空对象,并设置过期时间。
    缺点:可能导致缓存中存在大量空值键,例如在遭受恶意攻击或爬虫时。此外,缓存层与存储层的数据在短期内可能不一致。

  2. 使用布隆过滤器:在缓存层前使用布隆过滤器拦截非法请求,并自动将空值添加到黑名单。同时,需要考虑布隆过滤器的维护(可以选择离线生成或实时生成)。

2、缓存击穿

缓存击穿是指某个热点数据在缓存中失效,导致大量并发请求直接访问后端数据库。由于该数据的高访问频率,可能会造成数据库瞬时负载过高,甚至崩溃。

解决方案
  1. 加锁机制:在数据未命中缓存时,使用分布式锁(如 Redis 的 SETNX 或 Zookeeper)来确保只有一个请求可以查询数据库并更新缓存。其他请求在等待期间可以返回默认值或进行降级处理。

  2. 预加热缓存:在数据即将到期前主动更新缓存,确保热点数据始终在缓存中,减少请求直接落到数据库的风险。

  3. 设置合理的过期时间:对于热点数据,可以设置较长的过期时间,减少频繁的缓存失效情况。

  4. 使用互斥锁:在请求过程中引入互斥锁机制,确保只有一个请求能访问数据库,其他请求等待该请求完成后再获取缓存。

请求过程

        1.用户请求访问缓存,如果未命中,则通过分布式锁机制确保只有一个请求可以查询数据库。
        2.查询完成后,将数据更新到缓存,并释放锁,其他请求可以从缓存中获取数据。
        3.在锁的等待期间,其他请求可以返回默认值或进行降级处理,降低数据库的压力。

3、缓存雪崩

缓存雪崩是指大量缓存数据过期,大量请求直接落到数据库上,可能导致数据库承受大量并发请求而崩溃。如果只重启数据库,或者因为缓存重启后没有数据,新流量再次涌入,很快会再次击垮数据库。

解决方案

        1.事前:确保 Redis 高可用(主从 + 哨兵,Redis Cluster),以避免全盘崩溃。
        2.事中:使用本地 ehcache 缓存结合 Hystrix 进行限流和降级,避免数据库承受过多压力。
        3.事后:启用 Redis 持久化,一旦重启,自动从磁盘加载数据,以快速恢复缓存数据。

请求过程

        1.用户请求首先访问本地缓存,若未命中则访问 Redis;如果本地缓存和 Redis 均未命中,则查询数据库,并将数据添加到本地缓存和 Redis。
        2.由于设置了限流,超出请求的部分将在一定时间范围内被降级处理(例如返回默认值或给出友好的提示)。


http://www.kler.cn/a/298575.html

相关文章:

  • MySQL insert or update方式性能比较
  • STM32-笔记37-吸烟室管控系统项目
  • 【杂谈】-50+个生成式人工智能面试问题(一)
  • vulnhub靶场【DC系列】之7
  • Unity Burst详解
  • apex安装
  • SprinBoot+Vue停车场管理系统的设计与实现
  • ASP.NET Core 入门教学九 集成kafka
  • 华三(H3C)HDM服务器硬件监控指标解读
  • 重视测试与调试,别做甩手掌柜
  • 字符串API
  • 使用go语言获取海南七星彩历史开奖记录并打印输出
  • 万龙觉醒免费辅助,自动打金挂机脚本!VMOS云手机辅助开局发育攻略!
  • 内网安全:反弹shell
  • 代码随想录算法训练营第二十三天| 455. 分发饼干、376. 摆动序列、53. 最大子序和
  • 07_React 路由
  • JVM合集
  • C语言详细笔记--动态存储分配
  • es6中解构赋值
  • Python编程实例-使用Panda进行数据清洗
  • Excel文档的读入(4)
  • Dockerfile中的RUN、CMD、ENTRYPOINT指令区别
  • 天气API使用记
  • 常用设计模式的通俗解释和c语言实现
  • 时空特征融合方向小论文创新点一次性都给你!看到就是赚到
  • Containerd从harbor拉镜像报错