缓存问题 | 缓存穿透,缓存击穿,缓存雪崩

在这里插入图片描述

缓存穿透

关键字:强调缓存和数据库都没有数据+并发访问
缓存穿透是指数据库和缓存都没有的数据,每次都要经过缓存去访问数据库,大量的请求有可能导致DB宕机。

应对策略:

  1. 使用布隆过滤器(Bloom Filter):布隆过滤器就是一种快速判断元素是否存在的数据结构,它可以在很小的内存占用下,快速判断一个元素是否在一个集合中。将所有可能存在的数据哈希到一个足够大的位数组中,当一个请求过来时,先经过布隆过滤器判断是否存在于缓存中,如果不存在,则直接返回,避免对数据库的查询压力。
  2. 空对象缓存:对于确定不存在的数据,在缓存中也存储一个空对象,表示该数据不存在。当请求访问这些不存在的数据时,直接从缓存中返回空对象,避免每次请求都穿透到数据库层进行查询。
  3. 延迟双判:当一个查询请求穿透缓存到达数据库层后,先在数据库中进行查询,如果数据库中也没有对应的数据,则将这个空结果写入缓存,并设置一个较短的过期时间。这样,下次相同的查询请求就会从缓存中得到空结果,而不会再次穿透到数据库。
  4. 热点数据预加载:对于一些热点数据,在系统启动时或在缓存过期前提前异步加载到缓存中,确保缓存的热点数据一直存在,避免被频繁请求的数据因为缓存过期而导致穿透问题。
  5. 限流策略:针对频繁请求的特定数据,可以设置限流策略,例如使用令牌桶算法或漏桶算法,限制对这些数据的请求频率,减轻数据库的压力。

缓存击穿

关键词:强调单个热点key过期+并发访问
缓存击穿是指数据库有,缓存没有的热点数据,大量请求访问这个缓存不存在的数据,最后请求打到DB可能导致DB宕机。

应对策略:

  1. 设置热点数据的热度时间窗口:对于热点数据,可以设置一个热点时间窗口,在这个时间窗口内,如果一个数据被频繁访问,就将其缓存时间延长,避免频繁刷新缓存导致缓存击穿。
  2. 使用互斥锁或分布式锁:在缓存失效时,只允许一个线程去查询数据库,其他线程等待查询结果。可以使用互斥锁或分布式锁来实现,确保只有一个线程能够查询数据库,其他线程等待结果,避免多个线程同时查询数据库造成数据库压力过大。
  3. 缓存永不过期:对于一些热点数据,可以将其缓存设置为永不过期,或者设置一个很长的过期时间,这样即使缓存失效,也有足够多的时间来刷新缓存,避免缓存击穿。
  4. 异步更新缓存:在缓存失效时,可以异步的去更新缓存,而不是同步的去查询数据库并刷新缓存。这样可以减少对数据库的直接访问,并且不会阻塞其他请求的响应。
  5. 多级缓存架构:使用多级缓存架构,将热点数据分散到多个缓存节点上,避免单一缓存节点发生故障导致整个缓存层崩溃。当某个缓存节点失效时,可以从其他缓存节点或数据库中获取数据。
  6. 熔断机制:当缓存层发生故障或无法正常工作时,可以设置熔断机制,直接访问数据库,保证系统的正常运行。

缓存雪崩

关键词:强调批量key过期+并发访问
缓存雪崩指的是在同一时间段大量的缓存键(key)同时失效,导致大量请求打到数据库,最后请求打到DB可能导致DB宕机。

应对策略:

  1. 使用多级缓存架构:将缓存划分多个层级,每个层级的缓存设置不同的过期时间。例如:将热点数据存储在近期失效的缓存层级,而将非热点数据存储在长期失效的缓存层级。这样即使某一层级的缓存失效,仍然可以从其他层级获取数据,避免所有请求直接访问数据库。
  2. 设置缓存数据的随机过期时间:在设置缓存数据的过期时间时,加上一个随机值,使得不同的缓存数据在过期时刻不一致。这样可以避免大量数据同时过期,减轻数据库负荷。
  3. 分布式锁或互斥锁:在缓存失效时,使用分布式锁或互斥锁来保证只有一个请求可以重新加载缓存。其他请求等待该请求完成后,直接从缓存中读取数据。这样可以避免多个请求同时访问数据库。
  4. 数据预热:在系统启动或非高峰期,提前将热点数据加载到缓存中,预热缓存。这样即使在高并发时,也能通过从缓存中获取到数据,减轻数据库的压力。
  5. 缓存限流:当检测到缓存失效时,可以对请求进行限流处理,限制并发请求的数量。这样可以避免大量请求同时访问数据库,导致数据库负载过大。
  6. 数据库优化:对于缓存雪崩问题,除了缓存层面的应对策略,还可以从数据库层面进行优化,如提升数据库性能、增加数据库的容量等,以应对大量请求导致的数据库压力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/433898.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++力扣题目62--不同路径 63--不同路径II 343--整数拆分 96--不同的二叉搜索树

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。…

Vite+Electron快速构建一个VUE3桌面应用(一)

一. 简介 首先,介绍下vite和Electron。 Vite是一种新型前端构建工具,能够显著提升前端开发体验。Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入Chromium和Node.js到二进制的 Electron 允许您保持一个 JavaScript 代码代码…

剧本杀小程序开发:打造沉浸式推理体验

随着社交娱乐形式的多样化,剧本杀逐渐成为年轻人喜爱的聚会活动。而随着技术的发展,剧本杀小程序的开发也成为了可能。本文将探讨剧本杀小程序开发的必要性、功能特点、开发流程以及市场前景。 一、剧本杀小程序开发的必要性 剧本杀是一种角色扮演的推…

NPDP认证:产品经理的国际专业认证

你是否想证明自己在产品开发与管理方面的专业能力?NPDP认证正是你需要的!🔥 NPDP认证,即产品经理国际资格认证,由美国产品开发与管理协会(PDMA)所发起,是全球公认的新产品开发专业认…

Java入门高频考查基础知识7-深入挖掘Java集合框架的奇幻世界2(39题2.8万字参考答案)

Java 集合是 Java 编程中至关重要的组成部分,它为开发者提供了丰富、灵活、高效的数据结构和算法。无论是初学者还是有经验的开发者,在使用 Java 进行编程时都会频繁地接触到集合框架。这篇文章将深入探讨 Java 集合的重要性,以及为什么它对于…

SD342X-16Q双偏心软密封蝶阀的选型技巧分享

SD342X-16Q双偏心软密封蝶阀的选型技巧分享 选择SD342X-16Q双偏心软密封蝶阀软密封蝶阀时,需要考虑以下几个事项: 1.流体性质: 了解流体的压力、温度、粘度等特性,选择适合的软密封材料。不同材料对于不同流体具有不同的耐腐蚀性…

Leetcode刷题笔记题解(C++):1971. 寻找图中是否存在路径

思路: 1.建立图集,二维数组,path[0]里面存放的就是与0相连的节点集合 2.用布尔数组来记录当前节点是否被访问过,深度优先会使用到 3.遍历从起点开始能直接到达的点(即与起点相邻的点),判断那…

C#使用RabbitMQ-1_Docker部署并在c#中实现简单模式消息代理

介绍 RabbitMQ是一个开源的消息队列系统,实现了高级消息队列协议(AMQP)。 🍀RabbitMQ起源于金融系统,现在广泛应用于各种分布式系统中。它的主要功能是在应用程序之间提供异步消息传递,实现系统间的解耦和…

YOLOv8优化策略:轻量化改进 | RepGhost,通过重参数化实现硬件高效的Ghost模块

🚀🚀🚀本文改进:RepGhost,通过重参数化实现硬件高效的Ghost模块,性能优于GhostNet、MobileNetV3等,在移动设备上具有更少的参数和可比的延迟。 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.原…

互联网加竞赛 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的人脸专注度…

python爬虫基础

python爬虫基础 前言 Python爬虫是一种通过编程自动化地获取互联网上的信息的技术。其原理可以分为以下几个步骤: 发送HTTP请求: 爬虫首先会通过HTTP或HTTPS协议向目标网站发送请求。这个请求包含了爬虫想要获取的信息,可以是网页的HTML内…

xxl-job之API的方式接入

文章目录 1 xxl-job1.1 简介1.2 分析1.3 学习xxl-job源码1.4 改造项目1.4.1 接口调用1.4.1.1 对接登录接口1.4.1.2 对接执行器接口1.4.1.3 对接任务接口 1.4.2 创建新注解1.4.3 自动注册核心1.4.4 自动装配 1 xxl-job 1.1 简介 xxl-job是一款非常优秀的任务调度中间件&#x…