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

1. redis使用场景-缓存-缓存穿透

在实际开发中,Redis 被广泛应用于缓存,以提高系统性能和响应速度。然而,在使用缓存时,需要注意一些问题,其中 缓存穿透 是一个常见且需要重点关注的场景。

什么是缓存穿透

● 缓存穿透 指查询一个在缓存和数据库中都不存在的数据, 导致请求直接访问数据库,绕过了缓存层的保护。这种情况可能由以下原因引起:
○ 恶意攻击或爬虫频繁请求不存在的数据。
○ 业务逻辑错误,导致请求了无效的数据。
缓存穿透会增加数据库的负载,降低系统性能,甚至可能导致数据库宕机。

如何防止缓存穿透?

● 为了解决缓存穿透问题,常用的策略包括:

  1. 缓存空对象:
    ● 当查询的数据不存在时,将一个空对象(如 null)存入缓存。这样,下次请求相同的数据时,直接从缓存中获取,避免再次访问数据库。
    ● 优点:实现简单,维护方便。
    ● 缺点:会占用额外的内存空间,可能导致短期内的数据不一致。
  2. 使用布隆过滤器:
    ● 布隆过滤器是一个高效的概率数据结构,可以快速判断某个元素是否存在。它可以在请求数据库之前,先通过布隆过滤器判断数据是否可能存在于数据库中。
    ● 优点:内存占用少,避免了缓存空对象带来的额外内存消耗。
    ● 缺点:实现较为复杂,可能存在误判的情况。
  3. 使用白名单:
    ● 维护一个白名单,将所有合法的数据标识存入其中。查询时,先检查请求的数据是否在白名单中,如果不在,直接返回,避免访问数据库。

2. redis使用场景-缓存-缓存击穿

缓存击穿是另一个在使用 Redis 缓存时需要特别注意的问题,它通常发生在高并发环境下,尤其是在热点数据的情况下。

什么是缓存击穿

缓存击穿是指当某个缓存中的数据失效后,多个请求并发访问该数据时,所有请求都会去访问数据库,造成数据库压力暴增。具体来说,当缓存中的某个数据被删除或过期时,如果多个请求在同一时刻请求这个数据,所有的请求都将直接访问数据库,导致缓存的作用失效,增加了数据库的压力。

缓存击穿的典型场景

  1. 缓存过期:
    ● 缓存的数据过期后,多个请求同时到达,发现缓存为空,都会触发访问数据库的操作,造成大量的数据库请求。
  2. 热点数据:
    ● 如果某个数据是非常热门的数据(比如某个商品的详情页,或者某个页面的访问量极高),它在缓存过期时,可能会有成千上万的请求同时过来。因为缓存失效后,数据库的压力急剧增加,可能导致数据库崩溃。

缓存击穿的影响

● 数据库压力增大:由于所有请求都直接访问数据库,数据库可能会承受过高的负载,甚至可能因高并发请求而崩溃。
● 系统响应时间变慢:在高并发请求下,数据库响应时间变慢,用户体验受到影响。
● 资源浪费:多次查询相同的数据,浪费了系统资源和数据库的处理能力。

如何解决缓存击穿

  1. 使用互斥锁(Mutex)
    ● 通过 分布式锁(如 Redis 的 SETNX)来控制同一时刻只有一个请求可以去数据库拉取数据,其他的请求都等待数据库的响应,之后把数据缓存到 Redis。
    ● 步骤:
    ○ 请求到达时,发现缓存没有数据,尝试获取锁。
    ○ 获取锁的请求去查询数据库并缓存数据,其他请求等待。
    ○ 等待中的请求等到数据库返回数据后,再从缓存中取数据。
    ● 优点:可以确保在缓存失效时,只有一个请求会查询数据库,避免了缓存击穿。
    ● 缺点:锁的获取和释放需要一定的时间,可能会带来一些性能开销,且如果锁无法及时释放(如代码异常等情况),可能会导致请求阻塞。
  2. 使用缓存预热:
    ● 缓存预热是一种提前将热点数据加载到缓存的策略。例如,缓存可以在系统启动时或者数据更新时预先加载这些热点数据,这样在真实请求到来之前,缓存就已经准备好,不会发生缓存击穿。
    ● 优点:减少了缓存失效带来的数据库负担。
    ● 缺点:需要有明确的热点数据预知,且预热的操作需要额外的开发和维护。
  3. 设置缓存的过期时间(TTL)策略:
    ● 为缓存数据设置合理的过期时间,使得不同数据的缓存过期时间尽量错开,避免在同一时间段内大量数据同时失效,造成缓存击穿。
    ● 优点:避免缓存过期同时失效,平衡数据库的压力。
    ● 缺点:虽然可以避免击穿,但需要根据数据的访问频率和生命周期合理配置 TTL。
  4. 缓存异步加载:
    ● 当缓存失效时,可以先返回一个默认值(如空对象或默认数据),然后在后台异步加载数据并更新缓存。这样即使多个请求同时来,缓存仍然会有一个初始值返回,而不会直接查询数据库。
    ● 优点:减少了数据库的压力,提高了系统的响应速度。
    ● 缺点:实现复杂度较高,可能会出现“脏数据”,需要保证异步更新数据的准确性。

缓存击穿在实际工作中的应用

  1. 电商系统:
    ● 在电商平台中,某些热门商品的页面(如秒杀商品或限时折扣商品)通常会产生大量请求。如果缓存中没有及时更新热点商品的库存信息或价格信息,所有请求就会同时访问数据库,造成数据库压力。
    ● 解决方案:可以使用分布式锁来确保只有一个请求会访问数据库,其他请求会等待。
  2. 社交平台:
    ● 用户的动态信息、热门话题等数据可能在某一时间内迅速过时或失效,导致大量用户请求数据库,数据库可能因并发请求过多而崩溃。
    ● 解决方案:可以通过合理的缓存失效策略和缓存预热来避免高并发请求数据库。
  3. 新闻网站:
    ● 一些热点新闻在发布后的短时间内会引起大量访问,如果缓存失效时,可能会导致数据库的高并发查询。
    ● 解决方案:除了缓存的过期控制,还可以通过缓存预热来提前加载热门新闻的数据。

3. 缓存穿透和缓存击穿 的区别

根本原因就是定义不同

定义问题出处
缓存穿透问题的根源在于请求的数据本身不在数据库中 。问题出在查询的数据是否有效,或者请求是否合规。
缓存击穿问题的根源在于缓存中的数据失效了,导致大量请求并发查询数据库。数据是有效的,只是缓存没有及时恢复,所以请求会直接穿透缓存去访问数据库,导致数据库压力增大。

4. redis使用场景-缓存-缓存雪崩

Redis作为缓存系统,缓存雪崩是一个常见的问题,特别是在高并发的情况下。
缓存雪崩

缓存雪崩指的是在某一时刻,缓存系统中大量的缓存失效(比如缓存同时过期)或缓存服务器宕机,导致大量的请求直接访问数据库,从而造成数据库的巨大压力,最终可能导致数据库崩溃。

发生场景

  1. 缓存同时过期:如果缓存中的大量数据在同一时间点过期,客户端会发送大量的请求到数据库,导致数据库压力暴增。
  2. 缓存失效机制不合理:如果缓存的失效时间设置不合理,可能导致大量缓存数据在同一时间点过期,或者缓存没有有效的预加载机制。
    应对缓存雪崩的策略
  3. 设置不同的缓存过期时间:可以通过给不同的缓存设置不同的过期时间,避免缓存同时过期的情况。通常可以为缓存设置一定的随机过期时间。
  4. 使用加锁机制:当缓存数据失效时,通过锁机制确保只有一个请求能去加载数据,避免多个请求同时访问数据库。可以使用Redis的SETNX命令来实现分布式锁。
  5. 预加载缓存:通过提前加载缓存的方式,避免缓存空缺。比如定时任务定时加载缓存,确保缓存中数据的稳定性。
  6. 使用双重检查:当缓存失效时,可以在代码中做两次检查。第一次检查缓存,如果缓存为空,则去数据库加载数据并缓存;如果数据已经被加载缓存,再次检查时直接返回缓存结果。

区别总结

问题定义原因应对策略
缓存雪崩缓存中的大量数据在同一时间失效,造成大量请求直接访问数据库。缓存大量数据过期或缓存服务器宕机。设置不同的过期时间、使用加锁机制、定时更新缓存。
缓存击穿某个高频访问的缓存数据失效,导致数据库瞬时压力过大。高频访问的数据缓存失效。使用加锁机制、防止多个请求同时访问数据库、提前更新缓存。
缓存穿透请求查询的数据在缓存和数据库中都不存在,导致频繁访问数据库。请求数据不存在,或者恶意攻击导致频繁查询数据库。缓存空数据、请求过滤、使用布隆过滤器等避免不必要的查询。

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

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

相关文章

【YOLOv12改进trick】多尺度大核注意力机制MLKA模块引入YOLOv12,实现多尺度目标检测涨点,含创新点Python代码,方便发论文

🍋改进模块🍋:多尺度大核注意力机制(MLKA) 🍋解决问题🍋:MLKA模块结合多尺度、门控机制和空间注意力,显著增强卷积网络的模型表示能力。 🍋改进优势🍋:超分辨的MLKA模块对小目标和模糊目标涨点很明显 🍋适用场景🍋:小目标检测、模糊目标检测等 🍋思路…

better-sqlite3之exec方法

在 better-sqlite3 中,.exec() 方法用于执行包含多个 SQL 语句的字符串。与预编译语句相比,这种方法性能较差且安全性较低,但有时它是必要的,特别是当你需要从外部文件(如 SQL 脚本)中执行多个 SQL 语句时。…

电路基础:【1】PN结二极管制作电桥点亮LED灯

第一章:PN结二极管制作电桥点亮LED灯 文章目录 第一章:PN结二极管制作电桥点亮LED灯前言一、电路原理二、电路图与元器件1.电路图 做实验总结 前言 在本章中,我们将探讨如何通过PN结二极管制作电桥电路,并利用该电路点亮LED灯。L…

XHR请求解密:抓取动态生成数据的方法

在如今动态页面大行其道的时代,传统的静态页面爬虫已无法满足数据采集需求。尤其是在目标网站通过XHR(XMLHttpRequest)动态加载数据的情况下,如何精准解密XHR请求、捕获动态生成的数据成为关键技术难题。本文将深入剖析XHR请求解密…

机器学习数学基础:42.AMOS 结构方程模型(SEM)分析的系统流程

该流程图完整呈现了 AMOS 结构方程模型(SEM)分析的系统流程,具体步骤及内涵如下: 1. 模型设定 基于理论基础或研究假设,构建结构方程模型的初始框架,明确潜变量与显变量的关系、测量模型(因子…

以太网通讯

接口开发笔记-WebApi-CSDN博客 以太网常用通讯协议 1、modbus tcp using EasyModbus; using System;class Program {static void Main(string[] args){// 创建Modbus客户端实例ModbusClient modbusClient new ModbusClient("192.168.1.100"); // IP地址modbusCli…

Arcgis中添加脚本工具箱

文章目录 准备资料1、打开arcmap2、找到目录窗口3、复制粘贴工具箱的路径4、添加或者确认python脚本路径准备资料 (1)工具箱 (2)python脚本 1、打开arcmap 2、找到目录窗口 3、复制粘贴工具箱的路径 4、添加或者确认python脚本路径 脚本上右键属性(注意:脚本内容和路径…

TDengine SQL查询语法

简介 TDengine 中的查询 SQL 基本遵循 MYSQL 的查询语法,大部分查询都是通过超级表按时间维度进行的各种查询。 TDengine 时序数据库以时间为主索引列进行数据组织排序及存储,同时按存储块做了预计算,所以在无普通列过滤的 SQL 查询语句中聚…

Apache nifi demo 实验

Apache nifi 是个数据流系统,可以通过配置 自定义的流程来实现数据的转换。 比如可以配置一个流程,读取数据库里的数据,再转换,最后保存到本地文件。 这样可以来实现一些数据转换的操作,而不用特地编写程序来导入导出。…

javascript一些原生方法记录

Element.scrollIntoView() Element 接口的 scrollIntoView() 方法会滚动元素的父容器,使被调用 scrollIntoView() 的元素对用户可见。 structuredClone() 方法 Window 接口的 structuredClone() 方法使用结构化克隆算法将给定的值进行深拷贝。

记一次ScopeSentry搭建

介绍 Scope Sentry是一款具有资产测绘、子域名枚举、信息泄露检测、漏洞扫描、目录扫描、子域名接管、爬虫、页面监控功能的工具,通过构建多个节点,自由选择节点运行扫描任务。当出现新漏洞时可以快速排查关注资产是否存在相关组件。 目前功能 插件系…

Spring提供的SPEL表达式

SPEL 1. 概述 SpEL是Spring框架中用于表达式语言的一种方式。它类似于其他编程语言中的表达式语言,用于在运行时计算值或执行特定任务。 SpEL提供了一种简单且强大的方式来访问和操作对象的属性、调用对象的方法,以及实现运算、条件判断等操作。它可以…

【Azure 架构师学习笔记】- Azure Databricks (14) -- 搭建Medallion Architecture part 2

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (13) – 搭建Medallion Architecture part 1 前言 上文搭建了ADB 与外部的交互部分,本篇搭建ADB 内部配置来满足medallion 架构。…

vulnhub靶场之【digitalworld.local系列】的torment靶机

前言 靶机:digitalworld.local-torment,IP地址为192.168.10.12 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机选择使用VMware打开文件,都选择桥接网络 这里官方给的有两种方式&#xff0c…

docker-compose部署mongodb副本集集群

生成密钥文件 ​ openssl rand -base64 756 > mongodb.key chmod 400 mongodb.key # 权限必须为400‌:ml-citation{ref="4" data="citationList"} chown 999:999 mongodb.key # MongoDB容器用户ID为999‌:ml-citation{ref="4" data="…

k8s v1.28.15部署(kubeadm方式)

k8s部署(kubeadm方式) 部署环境及版本 系统版本:CentOS Linux release 7.9.2009 k8s版本:v1.28.15 docker版本:26.1.4 containerd版本:1.6.33 calico版本:v3.25.0准备 主机ip主机名角色配置1…

Redis特性总结

一、速度快 正常情况下,Redis 执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到 10 万 / 秒,当然这也取决于机器的性能,但这⾥先不讨论机器性能上的差异,只分析⼀下是什么造就了 Redis 如此之快,可以…

C# Unity 面向对象补全计划 之 索引器与迭代器

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本篇有部分内容出自唐老狮,唐老师网站指路:全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 目录 1.索引器 2.迭代器 1.索引器 我的理解 索…

深度学习PyTorch之13种模型精度评估公式及调用方法

深度学习pytorch之22种损失函数数学公式和代码定义 深度学习pytorch之19种优化算法(optimizer)解析 深度学习pytorch之4种归一化方法(Normalization)原理公式解析和参数使用 深度学习pytorch之简单方法自定义9类卷积即插即用 实时…

C++ Primer 拷贝控制和资源管理

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…