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

news2024/9/21 17:19:01

1 缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存中没有,每次查询都要去数据库中查询,导致频繁地访问数据库,从而影响系统的性能。攻击者可以利用这一点,对系统进行拒绝服务攻击。

在这里插入图片描述

1.1 缓存穿透举例

  1. 攻击者通过在请求中携带不存在的数据,进行大量的请求,导致系统访问数据库频繁,从而影响系统性能。

  2. 用户在查询不存在的数据时,由于缓存中没有,每次都会去数据库中查询,也会造成缓存穿透。

1.2 解决方法

  1. 使用布隆过滤器对查询的键进行过滤,如果查询的键不存在于布隆过滤器中,则直接返回不存在,不再查询缓存和数据库。
    布隆过滤器是一种空间效率很高的随机数据结构,它利用位数组和哈希函数实现,可以用于检索一个元素是否在一个集合中。布隆过滤器有一定的误判率,但是可以通过调整位数组的大小和哈希函数的数量来控制误判率。

  2. 如果查询的数据在数据库中不存在,则将空对象放入缓存中,下次再查询时直接从缓存中获取空对象,避免了频繁地去查询数据库。
    例如,当用户查询某个不存在的商品时,将一个空的商品对象放入缓存中,下次再查询时直接从缓存中获取该空对象。这样即使用户频繁地查询不存在的商品,也不会对数据库造成压力。

  3. 在应用启动时,或者定期地将热点数据加载到缓存中,避免缓存中没有数据导致的缓存穿透。
    热点数据是指访问频率高、对系统性能影响大的数据。将热点数据预先加载到缓存中可以避免缓存穿透。可以在应用启动时,或者定期地将热点数据加载到缓存中。可以使用缓存预热技术实现。

  4. 对请求增加校验机制,过滤掉不合理请求
    例如:课程Id是长整型,如果发来的不是长整型则直接返回。

1.3 名词解释

1.3.1 布隆过滤器

布隆过滤器是一种数据结构,可以高效地判断一个元素是否存在于一个集合中。它的主要优点是占用内存空间小、判断速度快,适用于需要快速判断元素是否存在于集合中的场景。布隆过滤器基于哈希函数实现,将元素映射到一个位数组中,并使用多个哈希函数进行映射,从而降低误判率。但是,由于布隆过滤器的空间有限,当元素数量过多时,误判率会增加,从而导致布隆过滤器失效。

1.3.1.1 布隆过滤器的优点
  1. 占用内存小:布隆过滤器只需要一段位数组和多个哈希函数,占用内存空间很小。

  2. 判断速度快:布隆过滤器只需要进行位运算,判断速度非常快。

  3. 可以判断元素是否一定不存在于集合中:如果布隆过滤器判断某个元素不存在于集合中,那么该元素一定不存在于集合中。

1.3.1.2 布隆过滤器的缺点
  1. 误判率高:由于布隆过滤器使用多个哈希函数进行映射,误判率会随着哈希函数数量的增加而降低,但仍然存在误判率。

  2. 无法删除元素:由于布隆过滤器的位数组是基于哈希函数映射得到的,无法删除某个元素。

  3. 受限于容量:当元素数量过多时,误判率会增加,从而导致布隆过滤器失效。

1.3.1.3 布隆过滤器容易失效的场景
  1. 元素数量过多:当布隆过滤器中的元素数量过多时,误判率会增加,从而导致布隆过滤器失效。

  2. 哈希函数数量不足:布隆过滤器的误判率与哈希函数数量有关,当哈希函数数量不足时,误判率会增加,从而导致布隆过滤器失效。

  3. 元素分布不均匀:当元素在哈希函数映射后分布不均匀时,误判率会增加,从而导致布隆过滤器失效。

总的来说,布隆过滤器适用于需要快速判断元素是否存在于集合中的场景,但需要注意它的误判率和容量限制,以及容易失效的场景。在使用布隆过滤器时,需要根据具体场景进行调整,以达到合理的使用效果。

2 缓存雪崩

缓存雪崩是指缓存中大量的数据同时失效,导致大量的请求直接打到数据库上,从而使得数据库承受不了巨大的压力,最终导致整个系统崩溃的现象。缓存雪崩通常是由于缓存中的键同时过期或者缓存服务宕机等原因引起的。

2.1 缓存雪崩举例

  1. 在某个时间点,所有的缓存数据都过期了。由于缓存中不存在有效的数据,所有的请求都会直接打到数据库上,导致数据库承受巨大的压力,最终导致整个系统崩溃。

  2. 某个缓存服务宕机了,所有的请求都无法得到缓存服务的响应,直接打到数据库上,导致数据库承受巨大的压力,最终导致整个系统崩溃。

2.2 解决方法

  1. 缓存数据的过期时间设置随机,避免缓存数据同时失效。可以将缓存数据的过期时间加上一个随机值,避免缓存数据同时失效。比如,将缓存数据的过期时间加上一个随机值,可以使得缓存数据的失效时间分散在时间轴上,避免缓存数据同时失效。
redisTemplate.opsForValue().set("key", JSON.toJSONString(valueObject),30 + new Random().nextInt(100), 
TimeUnit.SECONDS);
  1. 使用分布式缓存,避免单点故障。使用分布式缓存可以避免单点故障,提高缓存服务的可用性。可以使用Redis Cluster、Memcached等分布式缓存来替代单机缓存。

  2. 数据预热,避免缓存冷启动。在系统启动或者低峰期时,将一些热点数据预先加载到缓存中,避免缓存冷启动。可以使用缓存预热技术实现。

  3. 多级缓存,避免缓存失效时的“一次性打击”。多级缓存可以避免缓存失效时的“一次性打击”,提高缓存服务的稳定性。可以使用本地缓存和分布式缓存相结合的方式来实现多级缓存。

  4. 数据库压力保护。可以通过限流、降级等手段来保护数据库,避免数据库承受巨大的压力。可以使用限流、降级等技术来控制数据库的访问量。

3 缓存击穿

缓存击穿是指缓存中不存在的数据被大量请求,导致请求直接打到数据库上,从而使得数据库承受巨大的压力,最终导致整个系统崩溃的现象。缓存击穿通常是由于热点数据集中、缓存过期时间设置不合理等原因引起的。

在这里插入图片描述

3.1 缓存击穿举例

  1. 某个商品的详情信息是热点数据,每秒有很多请求访问该商品详情信息。如果缓存中不存在该商品的详情信息,那么所有请求都会直接打到数据库上,导致数据库承受巨大的压力,最终导致整个系统崩溃。

  2. 某个恶意用户故意请求一个不存在于缓存中的key,每秒有很多请求访问该key。如果缓存中不存在该key,那么所有请求都会直接打到数据库上,导致数据库承受巨大的压力,最终导致整个系统崩溃。

3.2 解决方法

  1. 使用互斥锁或者分布式锁,避免缓存击穿。在缓存失效时,使用互斥锁或者分布式锁,避免缓存击穿。在使用锁的时候,需要注意锁的粒度,尽量避免锁的粒度过大,影响系统的并发性能。

  2. 设置热点数据永不过期。对于热点数据,可以设置其永不过期,避免缓存失效。当然,这种方式需要注意缓存数据的大小,不要将所有数据都设置成永不过期,影响系统的内存使用。

  3. 在缓存失效时,设置短暂的锁定时间。在缓存失效时,可以设置短暂的锁定时间,避免缓存击穿。在锁定时间内,所有请求都会等待锁被释放后再访问数据库,避免了缓存击穿。

  4. 使用异步加载,避免缓存击穿。可以使用异步加载技术,将缓存数据的加载异步化,降低缓存击穿的风险。在缓存失效时,可以异步地加载数据到缓存中,避免大量请求直接打到数据库上。

  5. 增加缓存层,避免缓存击穿。可以增加缓存层,将热点数据缓存到更高层次的缓存中,避免缓存击穿。比如,可以将热点数据缓存到CDN中,避免请求直接打到数据库上。

3.3 名词解释

3.3.1 异步加载

异步加载是指在应用程序中,将数据加载操作放在后台线程中执行的一种技术。它的作用是提高系统的响应速度,并避免缓存失效时大量请求直接打到数据库上,导致数据库负载过高的情况,从而保证系统的稳定性。

在使用异步加载时,应用程序会在缓存失效时向后台线程发送请求,请求后台线程异步地从数据库中加载数据,并将数据存储到缓存中。后台线程会根据任务队列中的请求,异步地从数据库中加载数据,并在加载完成后将加载结果返回给主线程,主线程可以使用加载好的数据进行相应的操作。通过这种方式,应用程序可以避免主线程的阻塞,提高系统的响应速度。同时,异步加载还可以避免缓存击穿的风险,使系统更加稳定可靠。

3.3.1.1 异步加载举例

举个例子,假设我们有一个电商应用,需要加载商品列表数据。为了提高系统的响应速度,我们可以使用异步加载技术,将商品列表数据的加载异步化。

具体操作步骤如下:

  1. 当用户进入商品列表页面时,应用程序会向后台线程发送请求,请求后台线程加载商品列表数据。

  2. 后台线程会将请求放入任务队列中,等待执行。

  3. 后台线程会根据任务队列中的请求,异步地从数据库中加载商品列表数据,并将数据存储到缓存中。

  4. 当商品列表数据加载完成后,后台线程会将加载结果返回给主线程,主线程可以使用加载好的商品列表数据进行相应的操作,例如展示在页面上。

通过异步加载技术,我们可以避免用户在等待商品列表数据加载时出现卡顿的情况,提高了系统的响应速度。同时,如果缓存失效时,异步加载还可以避免大量请求直接打到数据库上,导致数据库负载过高的情况,从而保证了系统的稳定性。

异步加载是在缓存命中失败时才会触发的。 当缓存命中成功时,应用程序可以直接返回缓存中的数据,避免了不必要的数据库查询操作,从而提高了系统的性能。只有当缓存命中失败时,应用程序才会向后台线程发送请求,请求后台线程异步地从数据库中加载数据,并将数据存储到缓存中,这样可以避免缓存击穿的风险。因此,在实际应用中,异步加载通常是在缓存命中失败时才会使用的。

3.3.2 增加缓存层

增加缓存层是一种常见的避免缓存击穿的方法,可以将热点数据缓存到更高层次的缓存中,避免请求直接打到数据库上,从而提高系统的性能和稳定性。

下面是具体的解释:

  1. 缓存层级划分
    将缓存划分为多个层级,按照访问频率和数据更新频率的高低,将热点数据放在更高层次的缓存中。例如,可以将热点数据缓存到CDN中,将相对冷门的数据缓存到本地缓存或者分布式缓存中,将最不常用的数据缓存到数据库中。

  2. CDN缓存
    使用CDN缓存来缓存热点数据,可以将数据缓存在离用户更近的地方,避免请求直接打到数据库上。CDN缓存可以根据用户的地理位置,选择离用户更近的节点进行缓存,从而提高访问速度和稳定性。

  3. 缓存更新
    对于经常被访问和更新的数据,需要使用缓存更新策略,避免缓存失效后直接打到数据库上,导致缓存击穿。常见的缓存更新策略有定时更新和异步更新。定时更新是指在缓存过期前,定期将缓存中的数据更新为最新状态;异步更新是指在缓存失效后,异步地从数据库中加载数据,并将数据更新到缓存中。

  4. 缓存预热
    缓存预热是指在系统启动时,将热点数据提前加载到缓存中,避免缓存失效后直接打到数据库上,导致缓存击穿。缓存预热可以通过定时任务或者手动触发来实现。

综上所述,增加缓存层是一种有效的避免缓存击穿的方法,可以提高系统的性能和稳定性。但需要注意的是,缓存层级划分和缓存更新策略需要根据实际情况进行调整,避免缓存命中率过低或者缓存更新过于频繁,影响系统的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

课程《JavaWeb基础框架程序设计》考试题上篇——基础应用题(计算应用、水仙花数)

文章目录 📋前言🎯第一题(30分)🎯第二题(30分)📝最后 📋前言 这篇文章是大学课程《JavaWeb基础框架程序设计》考试题目的内容,包括了原题和答案。题目只包括…

开关电源基础07:离线式开关电源变压器设计(2)

说在开头:关于那几年 1933年希特勒上台成为德国总理,纳粹党开始了针对犹太人的运动。英国的弗雷德里克.亚历山大.林德曼教授到访柏林,他制定了一份名单,开列的都是处境不妙的犹太科学家,趁机邀请他们离开德国&#xf…

Java EE--多线程(一)

目录 一、认识多线程 1.1 概念 (1) 线程是什么 (2)为啥要有线程? (3) 进程和线程的区别 (4)Java 的线程和操作系统线程的关系 1.2 创建线程 方法1 继承 Thread 类 方法2 实现Runnable接口…

数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子&#xff1a; 要将百分制的考试成绩转化成五分制的成绩 if(score < …

ASEMI代理ADV7391BCPZ原装ADI车规级ADV7391BCPZ

编辑&#xff1a;ll ASEMI代理ADV7391BCPZ原装ADI车规级ADV7391BCPZ 型号&#xff1a;ADV7391BCPZ 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;LFCSP-32 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;32 工作温度:-40C~85C 类型&…

ChatGPT实现markdown 格式与 emoji 表情

markdown 格式与 emoji 表情 书写文章时&#xff0c;巧妙的使用一些小图标&#xff0c;可以给文章增加不少的灵动感&#xff0c;读者也会感觉更加轻松。恰当的图标也能增进读者对内容的理解。ChatGPT 目前不能直接联网&#xff0c;但可以使用 emoji 表情文字来达到类似的效果。…

笔记本电脑开机黑屏没反应怎么办?

笔记本电脑开机黑屏没反应怎么办&#xff1f;有用户电脑开机之后&#xff0c;桌面会变成黑屏显示。而且是常常都会出现这样的问题&#xff0c;非常影响自己的电脑使用体验。那么遇到这个问题要怎么去进行问题的解决呢&#xff1f;来看看以下的解决方法吧。 准备工作&#xff1a…

超级详细的mysql数据库安装指南

MySql数据库 如果你的电脑是mac那么你看这位大佬的分享。 如果你的电脑是windows&#xff0c;参考下面的安装步骤。 一、下载mysql数据库&#xff1f; 进入MySQL官方网站&#xff08;MySQL Community Downloads&#xff09;&#xff0c;按下图顺序点击 1、进入下载页面 2、…

Dom树,什么是dom树?

相信很多初学前端的小伙伴&#xff0c;学了html, css, js之后&#xff0c;会遇到 一个名词 DOM树。 首先说一下DOM是什么&#xff1f; DOM 是 Document Object Model&#xff08;文档对象模型&#xff09;的缩写。 举个例子 我们日常生活中&#xff0c;经常会遇到一些写文档…

Spring Cloud第二季--消息驱动Spring Cloud Stream

文章目录 什么是Spring Cloud StreamStream 原理 牛刀小试消息重复消费问题 什么是Spring Cloud Stream Spring Cloud Stream is a framework for building highly scalable event-driven microservices connected with shared messaging systems. The framework provides a fl…

linux系统函数的运用

函数 函数详解函数的作用函数的定义函数的返回值函数的作用范围函数传参函数递归函数库 函数详解 函数的作用 在编写shell脚本的时候&#xff0c;经常会发现在多个地方使用了同一段代码&#xff0c;如果只是一小段代码&#xff0c;一般也无关紧要&#xff0c;但是要在脚本中多…

如何禁止电脑运行游戏?

在休息的时候&#xff0c;很多人都喜欢使用电脑玩游戏来消磨时间&#xff0c;但是对于未成年人来说&#xff0c;很容易沉迷游戏&#xff0c;从而影响正常的学业和成长。那么如何才能禁止电脑运行游戏呢&#xff1f;下面我们就来了解一下。 除了将电脑游戏卸载之外&#xff0c;还…

markdown甘特图语法介绍

1. 介绍 甘特图&#xff08;Gantt chart&#xff09;又称为横道图、条状图(Bar chart)。其通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况。 2. 语法 1. 代码通用语法 在 markdown 的 代码模块 中编写甘特图&#xff0c;类型是mermaid&a…

华硕ROG|玩家国度魔霸新锐2023 Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原

华硕ROG|玩家国度魔霸新锐2023 Windows11原厂预装系统 工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个16G左右…

第三十二章 React路由组件的简单使用

1、NavLink的使用 一个特殊版本的 Link&#xff0c;当它与当前 URL 匹配时&#xff0c;为其渲染元素添加样式属性 <NavLink className"list-group-item" to"/home">Home</NavLink> <NavLink className"list-group-item" to&quo…

Python 密码破解指南:0~4

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 零、简…

stream笔记

1、 创建流stream 1.1、 Stream 的操作三个步骤 1.2、 stream中间操作 1.2.1 、 limit、skip、distinct 1.2.2、 map and flatMap 1.2.3、 sort 自然排序和定制排序 1.3、 add and andAll difference: 1.4、 终止操作 1.4.1、 allmatch、anyMatch、noneMatch、max、min…

JavaScript通过js的方式来判断一个数奇偶性的代码

以下为通过js的方式来判断一个数奇偶性的程序代码和运行截图 目录 前言 一、通过js的方式来判断一个数奇偶性&#xff08;html部分&#xff09; 1.1 运行流程及思想 1.2 代码段 二、通过js的方式来判断一个数奇偶性&#xff08;js部分&#xff09; 2.1 运行流程及思想 2…

美国新的 AI 研究基金将专注于 6 个领域

美国白宫周四宣布&#xff0c;在 1.4 亿美元的联邦资金支持下&#xff0c;拜登政府将开设七个新的人工智能实验室。 国家科学基金会将在其他政府机构的支持下掌舵运营。这些研究所将专注于六个研究课题&#xff1a; 1. 值得信赖的人工智能&#xff0c;隶属于马里兰大学领导的…

JustFE团队前端代码规范,降本增效,敏感肌可用

背景 &#x1f30f; 近年来&#xff0c;接手各个前端的代码&#xff0c;看着前人屎山&#xff0c;深恶痛绝 为了避免自己或者团队&#xff0c;继续添粪&#xff0c;因此经验总结一番~ 规范化优点&#xff1a; 容易理解&#xff0c;维护性强容易编写&#xff0c;扩展性强精准定…