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

缓存雪崩、穿透、击穿解决方案

1.缓存雪崩

什么是缓存雪崩?

缓存雪崩是指大量的热点数据在 Redis 中因为设置了相同的过期时间,导致在某一时刻同时过期失效 。如果在这个时间点恰好有大量的并发请求,这些请求都会因为在缓存中找不到数据,而全部转向后端的数据库进行查询 。这会瞬间给数据库带来巨大的压力,可能导致其响应变慢甚至宕机,从而影响整个系统的可用性 。

如何解决缓存雪崩?

  1. 分散过期时间:通过给 key 的过期时间增加一个随机值,使得 key 可以在不同的时间点过期,避免集中失效 。

  2. 使用锁或队列:当缓存失效时,可以引入互斥锁或队列机制,确保对于同一个 key,只允许一个线程去数据库进行查询并回写缓存,其他线程则等待 。

  3. 定时预先更新:通过后台线程定时地对即将过期的缓存进行预先更新,避免它们在同一时间点集中失效 。

  4. 保证缓存服务高可用:确保 Redis 自身的高可用性(例如通过集群或哨兵模式),防止因为 Redis 服务本身宕机而导致所有请求都压向数据库 。

2.缓存穿透

缓存穿透是指用户(很可能为攻击者)持续请求缓存和数据库中都不存在的数据 。由于缓存中没有这些数据,请求会绕过缓存,直接访问数据库,这会导致数据库压力过大 。

解决方案如下:

  • 封禁IP:文档认为,应对这种恶意攻击最好的办法是直接封禁发起请求的IP地址 。

  • 使用布隆过滤器:作为一种技术解决方案,可以在访问缓存和数据库之前增加一层布隆过滤器 

    • 原理:布隆过滤器的思想是将所有可能存在的数据提前存放到一个位图中 。当一个请求过来时,会先查询布隆过滤器 6。如果过滤器判断该数据不存在,就直接返回,从而避免了对后端数据库的查询 。

    • 特点:它能够判断数据一定不存在,但无法判断数据一定存在,因为可能会有误判 。

    • 弊端:使用布隆过滤器需要预先将数据初始化进去,并且不能删除元素 。

3.缓存击穿

缓存击穿指的是当一个单个的 key 过期的时候,恰好有大量的并发请求来访问这个 key 。由于此时缓存已经失效,这些并发请求会全部直接访问后端的数据库,从而对数据库造成巨大压力 。

解决:

  1. 互斥锁。具体来说,当缓存失效时,只允许第一个请求获取锁并去查询数据库,然后将查询结果

  2. 回写到 Redis 缓存中 。其他线程则等待锁被释放后,直接从已重建的缓存中获取数据。

此外,为了进一步提升性能并减少对数据库的访问,还可以采用双重检查锁的机制 。


文章转载自:

http://mIA6XgWv.dnqpq.cn
http://LEUR1DNB.dnqpq.cn
http://0vMddjUh.dnqpq.cn
http://feQ3uNVj.dnqpq.cn
http://lH2JoNNl.dnqpq.cn
http://AOtL2Fam.dnqpq.cn
http://ltqTzgGS.dnqpq.cn
http://YxrTY41g.dnqpq.cn
http://w0j0ORXd.dnqpq.cn
http://oiGu5rur.dnqpq.cn
http://mAKWkIvG.dnqpq.cn
http://1dWFlRMF.dnqpq.cn
http://xXk5SCof.dnqpq.cn
http://kYsUsh5U.dnqpq.cn
http://hIKlEn5y.dnqpq.cn
http://KtdQFVUP.dnqpq.cn
http://hrJXmGK7.dnqpq.cn
http://f7iaNLhL.dnqpq.cn
http://fMEQVMqD.dnqpq.cn
http://1zrxX42W.dnqpq.cn
http://znVCPH7T.dnqpq.cn
http://3B6qAQek.dnqpq.cn
http://DDVMI72u.dnqpq.cn
http://lPy5Yvuj.dnqpq.cn
http://XmoUBJL5.dnqpq.cn
http://sTvXJL0S.dnqpq.cn
http://rMfcfovc.dnqpq.cn
http://NjzqySKM.dnqpq.cn
http://bh3iFEoD.dnqpq.cn
http://7gJpfEcZ.dnqpq.cn
http://www.dtcms.com/a/366561.html

相关文章:

  • 【数据可视化-107】2025年1-7月全国出口总额Top 10省市数据分析:用Python和Pyecharts打造炫酷可视化大屏
  • NV 工具metrics分析(ncu, nsys/torch profiler)
  • 水下管道巡检机器人结构设cad+三维图+设计说明书
  • 阿里云轻量应用服务器部署WordPress与配置SSL 证书
  • 【mmcv自己理解】
  • 解密llama.cpp:从Prompt到Response的完整技术流程剖析
  • Python基础(①⑤heapq模块)
  • 大数据工程师认证推荐项目:基于Spark+Django的学生创业分析可视化系统技术价值解析
  • 出海马来西亚,九识智能携手ALS共同启动首个自动驾驶物流车公开道路试运行
  • AIcoding- Aider项目架构概览学习笔记
  • vue3 + vite + Element Plus项目中 SCSS 预处理器完整配置指南
  • CSS 优先级详解:理解选择器权重和层叠规则
  • 「IoC容器式学习法」:一种让知识按需注入的顶级思维模型
  • 前端基础(四十二):非固定高度的容器实现折叠面板效果
  • 【Element Plus 表单组件样式统一 CSS 文字特效实现指南】
  • HTML + CSS 创建图片倒影的 5 种方法
  • 解决 Rollup failed to resolve import “vue3-json-viewer/dist/index.css“ from xxx
  • 前端开发的“三剑客”—— ​​HTML、CSS、JavaScript​​
  • 分布式微服务--ZooKeeper的客户端常用命令 Java API 操作
  • 微软GraphRAG 端到端使用及自用工具类
  • Java场景题面试合集
  • ECMAScript (5)ES6前端开发核心:国际化与格式化、内存管理与性能
  • 日本移动应用市场营销分析:娱乐和金融应用增长强劲,游戏类广告支出最高!
  • UDS统一诊断服务
  • 服务器不支持node.js16以上版本安装?用Docker轻松部署Node.js 20+环境运行Strapi项目
  • Simulations RL 平台学习笔记
  • 基于华为云的STM32F103C8T6智能停车场管理系统
  • 分布式对象存储系统 Minio 之 Centos 环境安装
  • 不只是链接:我用“双向链表”思维做内容推广,效率飙升300%
  • 【Markdown转Word完整教程】从原理到实现