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

Redis_缓存3_缓存异常(数据不一致、雪崩、击穿、穿透)

14.6缓存异常

四个方面

  • 缓存中数据和数据库不一致
  • 缓存雪崩
  • 缓存击穿
  • 缓存穿透

14.6.1数据不一致:

一致性包括两种情况

  • 缓存中有数据,需要和数据库值相同
  • 缓存中没有数据,数据库中的数据是最新值

如果不符合以上两种情况,则出现数据不一致的问题。

读写缓存

  • 同步直写
  • 异步写回

只读缓存

  1. 新增数据
    • 数据直接写到数据库中,缓存不做操作。满足一致性两种情况的第2种。
  2. 删改数据
    • 先删除缓存,后更新数据库。可能会导致,缓存删除成功,数据库更新失败。业务逻辑去访问数据时,缓存中查不到数据,缓存缺失,到数据库中查询,所以只拿到旧的数据。
    • 如果新更新数据库,再删除缓存。可能会导致,数据库更新成功,缓存删除失败。数据库中的数据是新的值,缓存中存储的是旧值。再读取时,先从缓存中读取,读取到了旧值。

解决数据不一致的方案

  • 重试机制:把删除的缓存值或要更新数据库值先存储到消息队列中(kafka消息队列)。
  • 如果发现试了10次还不成功就会向服务器端报错

多线程访问的情况

  1. 先删除缓存,再更新数据库。
    • 假设T1线程先删除缓存,再执行更新数据库。还未更新成功时,T2线程进行读取,发现缓存中没有数据,到数据库中读取,会读取到旧的数据。如果T2还将旧数据更新到缓存中,那T1线程再进行读取,也读到的旧值。
    • 让T1线程先执行休眠一段时间。T1线程在休眠时间,让T2线程执行结束,会将数据重新写入缓存。T1线程再做一次缓存删除操作。“延迟双删”。
      redis.delCache()
      db.update()
      Thread.sleep(2000)
      redis.delCache()
      
  2. 先更新数据库值,再去删除缓存
    • 假设T1线程先删除或更新数据库中的值,还没来得及删除缓存时,T2线程就开始读取数据。T2会先从缓存中读取,缓存命中,T2拿到的就是旧的数据。直到T1将缓存中数据删除,其他线程再次读取,可以拿到新值.
并发操作执行顺序可能出现问题问题描述解决方案
没有先删除缓存,后更新数据库缓存删除成功,数据库更新失败从数据库读到旧数据重试(通过消息队列)
先删除缓存,后更新数据库缓存删除,未更新数据库,其他线程并发访问并发线程从数据库读到旧值,并更新了缓存,其他线程都从缓存中读到旧值延迟双删
没有先更新数据库,后删除缓存数据库更新成功,缓存删除失败从缓存中读到旧值重试(通过消息队列)
先更新数据库,后删除缓存数据库更新成功,未删除缓存,其他同线程并发访问并发线程从缓存读到旧值会有数据不一致情况短暂存在

14.6.2 缓存雪崩

大量的应用请求无法在redis中完成处理。缓存中读取不到数据,直接进入到数据库服务器。数据库压力激增,数据库崩溃,请求堆积在redis,导致redis服务器崩溃,导致redis集群崩溃,应用服务器崩溃,称为雪崩

原因1:缓存中有大量数据同时过期

解决方案:

  1. 页面静态化处理数据:对于不经常更换的数据,生成静态页
  2. 避免大量数据同时过期:为商品过期时间追加一个随机数,在一个较小的范围内(1~3分钟)。
  3. 构建多级缓存架构:redis缓存+nginx缓存+ehcache缓存
  4. 延长或取消热度超高的数据过期时间
  5. 服务降级

不同的数据采取不同的处理方式。

原因2:redis实例故障

解决方案:

  1. 服务熔断或限流处理

提前预防:

  • 灾难预警:监控redis服务器性能指标,包括数据库服务器性能指标,CPU、内存、平均响应时间、线程数等
  • 集群:有节点出一故障,主从切换。

14.6.2 缓存击穿

对某个访问频繁热点数据的请求。主要发生在热点数据失效
解决方案:

  • 预先设定:电商双11,商铺设定几款是主打商品,延长过期时间
  • 实时监控:监控访问量,避免访问量激增
  • 定时任务:启动任务调度器,后台刷新数据有效期
  • 分布式锁:可防止缓存击穿,但会有性能问题 (不推荐)

14.6.3 缓存穿透

要访问的数据在redis中不存在,在数据库中也不存在。
原因:

  1. 业务层误操作
  2. 恶意攻击

解决方案:

  1. 缓存空值或缺省值
  2. 使用布隆过滤器,快速判断数据是否存在
  3. 在请求入口前端进行请求检测
  4. 实时监控
  5. key加密

相关文章:

Redis_缓存3_缓存异常(数据不一致、雪崩、击穿、穿透)

14.6缓存异常 四个方面 缓存中数据和数据库不一致缓存雪崩缓存击穿缓存穿透 14.6.1数据不一致: 一致性包括两种情况 缓存中有数据,需要和数据库值相同缓存中没有数据,数据库中的数据是最新值 如果不符合以上两种情况,则出现…...

谁能讲清楚Spark之与MapReduce的对比

我们已经知道Spark是如何设计和实现数据处理流程的,这里我们 再深入思考一下,为什么Spark能够替代MapReduce成为主流的大数据处理框架呢?对比MapReduce,Spark究竟有哪些优势? 一 优势 1 通用性: 基于函数式编程思想,MapReduce将数据类型抽象为,k,v格式,并将数据处理…...

Android自定义侧滑Item

源码地址&#xff1a;https://github.com/LanSeLianMa/CustomizeView/tree/master/cehuaitem 使用方式一&#xff1a;XML布局中直接使用 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com…...

c++11 标准模板(STL)(std::basic_stringbuf)(三)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allocator<CharT> > class basic_stringbuf : public std::basic_streambuf<CharT, Traits> std::basic_stringbuf…...

Nodejs 第九章(模块化)

Nodejs 模块化规范遵循两套一 套CommonJS规范另一套esm规范 CommonJS 规范 引入模块&#xff08;require&#xff09;支持四种格式 支持引入内置模块例如 http os fs child_process 等nodejs内置模块支持引入第三方模块express md5 koa 等支持引入自己编写的模块 ./ …/ 等支…...

shell之正则表达式及三剑客grep命令

一、正则表达式概述 什么是正则表达式&#xff1f; 正则表达式是一种描述字符串匹配规则的重要工具 1、正则表达式定义: 正则表达式&#xff0c;又称正规表达式、常规表达式 使用字符串描述、匹配一系列符合某个规则的字符串 正则表达式 普通字符&#xff1a; 大小写字母…...

LeetCode 热题 100 JavaScript--33. 搜索旋转排序数组

整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nums[1], …,…...

并发编程 - 线程池中的常见面试题

目录 1. 线程池相比于线程有什么优点 2. 线程池的参数有哪些 3. 线程工厂有什么用 4. 说一下线程的优先级 5. 说一下线程池的执行流程 6. 线程池的拒绝策略有哪些 7. 如何实现自定义拒绝策略 8. 如何判断线程池中的任务是否执行完成 1. 线程池相比于线程有什么优点 有…...

将多个单独的 Excel 文件合并成一个,并添加标题行

要将多个单独的 Excel 文件合并成一个&#xff0c;并添加标题行&#xff0c;可以使用 Python 的 pandas 库。以下是一个示例代码&#xff0c;假设要合并的 Excel 文件都在同一个文件夹中&#xff1a; import os import pandas as pd # 指定文件夹路径 folder_path path/to/fo…...

VPN pptp和l2tp协议破解

代码下载地址&#xff1a; https://download.csdn.net/download/m0_37567738/88215516?spm1001.2014.3001.5501...

4.3、Flink任务怎样读取Kafka中的数据

目录 1、添加pom依赖 2、API使用说明 3、这是一个完整的入门案例 4、Kafka消息应该如何解析 4.1、只获取Kafka消息的value部分 ​4.2、获取完整Kafka消息(key、value、Metadata) 4.3、自定义Kafka消息解析器 5、起始消费位点应该如何设置 ​5.1、earliest() 5.2、lat…...

C语言实例_和校验算法

一、算法介绍 和校验&#xff08;Checksum&#xff09;是一种简单的纠错算法&#xff0c;用于检测或验证数据传输或存储过程中的错误。它通过对数据进行计算并生成校验和&#xff0c;然后将校验和附加到数据中&#xff0c;在接收端再次计算校验和并进行比较&#xff0c;以确定…...

安全加密框架图——Oracle安全开发者

Oracle安全开发者 ACLs 设计 ACLs&#xff08;访问控制列表&#xff09;时&#xff0c;可以根据以下思路进行设计&#xff1a; 所有者文件权限&#xff1a;确定文件的所有者能够对文件执行哪些操作&#xff0c;如读取、写入、执行等。这可以根据文件的性质和拥有者的职责来决…...

Android databinding 被多次定义

一、报错&#xff1a; AndroidStudio运行代码时&#xff0c;编译器报 Type androidx.databinding.Bindable is defined multiple times...... 二、解决&#xff1a; 点击 Build -> Clean Project&#xff0c;关闭编译器再打开即可。 三、解决过程&#xff1a; 在使用Andro…...

云原生周刊:Kubernetes v1.28 新特性一览 | 2023.8.14

推荐一个 GitHub 仓库&#xff1a;Fast-Kubernetes。 Fast-Kubernetes 是一个涵盖了 Kubernetes 的实验室&#xff08;LABs&#xff09;的仓库。它提供了关于 Kubernetes 的各种主题和组件的详细内容&#xff0c;包括 Kubectl、Pod、Deployment、Service、ConfigMap、Volume、…...

机器学习之分类模型

机器学习之分类模型 概述分类模型逻辑回归最近邻分类朴素贝叶斯支持向量机决策树随机森林多层感知机基于集成学习的分类模型VotingBaggingStackingBlendingBoosting 概述 机器学习分类模型通过训练集进行学习&#xff0c;建立一个从输入空间 X X X到输出空间 Y Y Y&#xff08…...

学习Vue:创建第一个Vue实例

当您开始探索 Vue.js&#xff0c;第一步就是创建一个 Vue 实例。Vue 实例是 Vue.js 应用程序的核心构建块&#xff0c;它使您能够将数据与用户界面连接起来&#xff0c;实现动态交互。在本文中&#xff0c;我们将详细介绍如何创建您的第一个 Vue 实例。 步骤1&#xff1a;引入 …...

JavaFx基础学习【二】:Stage

一、介绍 窗口Stage为图中标绿部分&#xff1a; 实际为如下部分&#xff1a; 不同的操作系统表现的样式不同&#xff0c;以下都是以Windows操作系统为例&#xff0c;为了使大家更清楚Stage是那部分&#xff0c;直接看以下图&#xff0c;可能更清楚&#xff1a; 有点潦草&…...

C语言——动态内存函数(malloc、calloc、realloc、free)

了解动态内存函数 前言&#xff1a;一、malloc函数二、calloc函数三、realloc函数四、free函数 前言&#xff1a; 在C语言中&#xff0c;动态内存函数是块重要的知识点。以往&#xff0c;我们开辟空间都是固定得&#xff0c;数组编译结束后就不能继续给它开辟空间了&#xff0…...

Redis数据结构——Redis简单动态字符串SDS

定义 众所周知&#xff0c;Redis是由C语言写的。 对于字符串类型的数据存储&#xff0c;Redis并没有直接使用C语言中的字符串。 而是自己构建了一个结构体&#xff0c;叫做“简单动态字符串”&#xff0c;简称SDS&#xff0c;比C语言中的字符串更加灵活。 SDS的结构体是这样的…...

Yokogawa AAI835-H50/K4A00模拟输入/输出模块

Yokogawa AAI835-H50/K4A00 模拟输入/输出模块产品特点&#xff1a;通道配置&#xff1a;共8个通道&#xff0c;含4路模拟输入和4路模拟输出。信号类型&#xff1a;所有通道均支持4-20mA标准电流信号。HART通信&#xff1a;支持HART协议&#xff0c;可与智能现场设备双向数字通…...

BLE蓝牙扫描深度剖析:扫描原理、核心参数、前后台差异

一、前言BLE设备交互分为两大角色&#xff1a;广播端&#xff08;外设Peripheral&#xff09;与扫描端&#xff08;中心Central&#xff09;。上一篇博客详解了四大广播模式&#xff0c;本文聚焦配套核心能力——BLE扫描机制。绝大多数蓝牙开发疑难问题&#xff1a;前台能扫后台…...

力扣HOT100(30)两两交换链表中的节点

链表的交换要注意 “链表不断链”。前驱和后继都要连着迭代法&#xff08;必学死磕&#xff01;O (n) 时间&#xff0c;O (1) 空间&#xff09;1. 为什么必须用虚拟头节点&#xff1f;因为交换后链表的头节点会变&#xff01; 比如示例 1 中&#xff0c;原来的头是 1&#xff0…...

2605.VGGT-Omega 论文解读: 3D重建的Scaling Law, Register Attention效率革命 | Oxford+Meta CVPR26 Oral

VGGT-Omega: Scaling Feed-Forward 3D Reconstruction Jianyuan Wang, Minghao Chen, Shangzhan Zhang, Nikita Karaev, Johannes Schonberger, et al. Visual Geometry Group, Oxford Meta AI | CVPR 2026 Oral | arXiv 2605.15195 Paper | Project Page 一句话总结 VGGT-Om…...

户外实用|艾迪欧 R6000 测评 —— 户外 / 自驾 / 露营的通讯好搭档

户外出行&#xff0c;通讯工具的核心是稳定、清晰、耐用、续航久、功能全。艾迪欧 R6000 作为一款兼顾专业与户外的 DMR 对讲机&#xff0c;全频段覆盖、双模通讯、自定义功能、长续航&#xff0c;完美适配自驾、露营、登山、越野等户外场景&#xff0c;是户外爱好者的靠谱通讯…...

为内部知识库问答机器人接入Taotoken多模型增强回答效果

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为内部知识库问答机器人接入Taotoken多模型增强回答效果 构建一个高效的企业内部知识库问答机器人&#xff0c;核心挑战在于如何让…...

rk35xx 通过recovery升级问题

Firefly 的 recovery 库是一个核心组件&#xff0c;它构建了一个独立的微型 Linux 系统&#xff0c;专门用于在设备主系统之外执行高可靠性的固件升级。简单来说&#xff0c;它的工作流程是&#xff1a;主系统通过命令触发&#xff0c;将升级指令写入特定分区并重启&#xff1b…...

phpMyAdmin CVE-2018-12613:从文件读取到RCE的伪协议利用链

1. 这个漏洞不是“能读文件”那么简单&#xff0c;而是后台权限的彻底失守phpMyAdmin 4.8.1里那个CVE-2018-12613&#xff0c;很多人扫到就报个“存在文件包含”&#xff0c;顺手贴个?targetphp://filter/convert.base64-encode/resource/etc/passwd截图完事。我去年在给一家教…...

手把手教你用Mind+和Blynk,让手机轻松遥控掌控板(含自建服务器避坑指南)

从零搭建物联网控制平台&#xff1a;Mind与Blynk深度整合实战 当你第一次尝试用手机控制硬件设备时&#xff0c;那种"隔空取物"的奇妙感总会让人兴奋不已。想象一下&#xff0c;躺在沙发上就能调节书桌上的智能台灯亮度&#xff0c;或者在外出时随时查看家中的温湿度…...

如何快速集成 react-native-bottom-sheet-behavior:5 分钟搞定 Android 底部弹窗

如何快速集成 react-native-bottom-sheet-behavior&#xff1a;5 分钟搞定 Android 底部弹窗 【免费下载链接】react-native-bottom-sheet-behavior react-native wrapper for android BottomSheetBehavior 项目地址: https://gitcode.com/gh_mirrors/re/react-native-bottom…...