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加密

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

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

相关文章

Linux tee

tee 是一个命令行工具,它可以从标准输入读取数据,并将其同时输出到标准输出和指定的文件中。tee 命令非常实用,特别是在需要同时查看输出内容和将其保存到文件中的情况下。 tee 命令的基本语法如下: command | tee [options] [f…

Mysql 搭建MHA高可用架构,实现自动failover,完成主从切换

目录 自动failover MHA: MHA 服务 项目:搭建Mysql主从复制、MHA高可用架构 实验项目IP地址配置: MHA下载地址 项目步骤: 一、修改主机名 二、编写一键安装mha node脚本和一键安装mha mangaer脚本,并执行安装 …

docker容器限定ip访问

docker容器限定ip访问 一、测试所需环境:二、使用docker的 iptables 策略三、Docker使用iptables 与系统Firewalld之间的关系四、冲突解决方案 一、测试所需环境: 主机1: ip:192.168.3.117 环境配置:docker、httpd(do…

你真的了解ORM吗?通过一个简单的例子来学习ORM

什么是ORM ORM(Object-Relational Mapping)是一种将面向对象程序数据模型与关系数据库之间进行映射的技术。 比如数据库表user,它有id、name、age字段映射到Java实体类就是User类,有id、name、age属性。 CREATE TABLE user (id…

2023国赛 高教社杯数学建模ABCDE题思路汇总分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

echarts加钓鱼岛赤尾屿(vue)(亲测有效)

1.首先引入json文件,node_modules/echarts中就有 import chinaData from "../../node_modules/echarts/map/json/china.json" 2.初始化地图,在初始化地图的时候加入钓鱼岛和赤尾屿的数据,在chinaData下的features中加入即可&#x…

Design-Pattern设计模式

Design-Pattern设计模式 图说设计模式 图说设计模式 在线书籍 软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括 架构模式、分析模式和过程模式等,实际上&#xff…

FFmpeg常见命令行(四):FFmpeg流媒体

前言 在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。本文是音视频系…

leetcode做题笔记77组合

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 思路一:直接求出组合数将每个组合放进数组中 int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {int size 0, num 1, i;in…

Rust中的智能指针:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak<T>

Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地址的变量的通用概念。这个地址引用,或 ” 指向”…

UML 类图的画法

1.类图的画法 类 整体是个矩形,第一层类名,第二层属性,第三层方法。 :public- : private# : protected空格: 默认的default 对应的类写法。 public class Student {public String name;public Integer age;protected I…

2023杭电第七场补题报告1002 1004 1011 1013

2023杭电第七场补题报告1002 1004 1011 1013 1002 B. Random Nim Game (hdu.edu.cn) 思路 手推一下就可以发现其实除了一次必定结束的其他情况概论都是 1 2 \frac{1}{2} 21​ 代码 #include <bits/stdc.h> using namespace std; #define int long long void solve()…

【hello C++】特殊类设计

目录 一、设计一个类&#xff0c;不能被拷贝 二、设计一个类&#xff0c;只能在堆上创建对象 三、设计一个类&#xff0c;只能在栈上创建对象 四、请设计一个类&#xff0c;不能被继承 五、请设计一个类&#xff0c;只能创建一个对象(单例模式) C&#x1f337; 一、设计一个类&…

Sentinel使用实例

不说了&#xff0c;直接上官方文档 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md Sentinel Example 项目说明 本项目演示如何使用 Sentinel starter 完成 Spring Clo…

【金融量化】对企业进行估值的方法有哪些?

估值的方法有哪些&#xff1f; 如何对企业进行估值&#xff1f;有2个方法估算。 1 绝对估值法 它是一种定价模型&#xff0c;用于计算企业的内在价值。 比如说你可以根据公司近N年的现金流情况。借此去预测未来N年的现金流情况。所有的现金流数据都可以在年报上查询到。最后…

ios 知识

IOS 类文件.h和.m中interface的区别 大家都知道我们在创建类文件时会发现&#xff1a; #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend和 #import "ViewController.h"interface ViewController ()end那么他们之间有何区别呢&#x…

【Ajax】回调地狱解决方法

回调地狱&#xff08;Callback Hell&#xff09;是指在异步编程中&#xff0c;特别是在嵌套的回调函数中&#xff0c;代码变得深度嵌套、难以阅读和维护的现象。这通常发生在处理多个异步操作时&#xff0c;每个操作都依赖于前一个操作的结果。回调地狱使代码变得难以理解、扩展…

显卡服务器适用于哪些场景

显卡&#xff08;GPU&#xff09;服务器&#xff0c;简单来说&#xff0c;GPU服务器是基于GPU的应用于视频编解码、深度学习、科学计算等多种场景的快速、 稳定、弹性的计算服务。那么壹基比小鑫告诉你显卡服务器主要的用途有哪一些。 一、运行手机模拟器 显卡服务器可支持…

力扣:62. 不同路径(Python3)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

WebRTC音视频通话-WebRTC本地视频通话使用ossrs服务搭建

iOS开发-ossrs服务WebRTC本地视频通话服务搭建 之前开发中使用到了ossrs&#xff0c;这里记录一下ossrs支持的WebRTC本地服务搭建。 一、ossrs是什么&#xff1f; ossrs是什么呢&#xff1f; SRS(Simple Realtime Server)是一个简单高效的实时视频服务器&#xff0c;支持RTM…