Redis学习——数据不一致怎么办?更新缓存失败了又怎么办?

news2024/9/27 23:26:33

文章目录

    • 引言
    • 正文
      • 读写缓存的数据一致性
      • 只读缓存的数据一致性
        • 删除和修改数据不一致问题
          • 操作执行失败导致数据不一致
            • 解决办法
        • 多线程访问导致数据不一致问题
        • 总结
    • 总结
    • 参考信息

引言

  • 最近面试快手的时候被问到了缓存不一致怎么解决?一开始还是很懵的,因为会默认将自己带到一个错误的前提下,就是数据已经不一致了,你怎么办?可能会想,遍历缓存,删除比对数据是不是一致的。停下来想一下,一般是修改数据库的时候,你应该怎么操作缓存,才能保证缓存的一致性。我就知道要么删除缓存后续重建,要么直接修改缓存,但是我对于这两种场景的方法了解的并不多,今天借这个机会,完全整理一下!

正文

数据一致分几种情况?

  • 缓存中有数据,必须要和数据库中的数据一致
  • 缓存中本身没有数据,数据库中的值必须要是最新的

常见的缓存的策略主要有两种,分别是读写缓存和只读缓存,不同策略保证缓存一致性的方式是不一样。具体如下

读写缓存的数据一致性

  • 读写缓存是对于数据的所有增删改都需要在缓存中进行,然后在采取对应的写回策略。主要有两种写回策略
    • 同步直写策略
    • 异步写回策略

在这里插入图片描述

同步直写策略

  • 写缓存的时候,同步写数据库,缓存和数据库中的数据是一致的
    • 需要通过事务机制,保证缓存和数据库更新的原子性,一般是通过tranactional修饰
      • 要么同步更新成功
      • 要么同步更新失败,下次重试

在这里插入图片描述

异步写回策略

  • 写缓存的时候,不同步写入缓存,等到数据从缓存中淘汰的时候,在写入数据库。
    • 问题
      • 一旦缓存崩溃,在缓存中保存的数据,都会崩溃丢失

在这里插入图片描述

只读缓存的数据一致性

  • 如果有数据更新(数据增加和修改),直接写入数据库,缓存只负责读数据

    • 在下述过程中,可以看到整个过程是涉及到多步骤多线程的,除了对于数据的操作是具有原子性的,不可打断的,其他的读数据包括数据库同步删除缓存中的数据,都会存在可能的中断,或者其他线程切入的操作

    在这里插入图片描述

新增数据情况==》不会出现数据不一致的情况

在这里插入图片描述

  • 但是删除数据或者修改数据不一样了,因为中间涉及到需要删除缓存中的数据,这一步执行失败会导致数据不一致的情况,具体情况见下一节!
删除和修改数据不一致问题
操作执行失败导致数据不一致

操作分析

  • 对于删除或者修改数据的操作,需要同时修改缓存和操作数据库,任何一方都有可能执行失败,因为没有办法保证双方的操作具有原子性,也就是同时失败或者同时成功。
  • 下面按照情况,进行逐个分析,分别是删除缓存失败和删除数据库失败两种情况。

删除缓存失败

  • 在下述过程中,删除缓存失败,导致缓存中保存旧版的数据,数据库是新版的数据,两者不一致。
    在这里插入图片描述

修改数据库失败

  • 修改数据库失败了,删除缓存成功了,但是在二次访问会重建缓存,将数据库中的脏数据,还原到缓存中,还是会出现访问错误数据的情况
    在这里插入图片描述

总结

  • 两种操作执行失败带来的数据不一致的情况如下
不同情况潜在问题
先删除缓存,在更新数据库数据库更新失败,导致请求再次访问缓存时,发现缓存缺失,重建缓存,读到的还是旧的数据
先更新数据库,再删除缓存的缓存删除失败,有请求再次访问缓存时,发现缓存命中,返回脏数据,和数据库不一致
解决办法
  • 在上述两种情况中,如果修改数据库的操作执行失败了,其实不会产生数据不一致的问题,因为缓存中的数据和数据库中的数据是一致的,后续数据库执行相应的处理策略。但是缓存删除执行失败,就不一样了。所以这个解决办法,主要是针对缓存删除失败的情况而指定的。

消息队列重试

  • 在进行删除或者修改数据时,将数据保存到消息队列中,如果执行失败,再通过消息队列重试执行,如果执行成功了,就从消息队列中删除对应的值。

在这里插入图片描述

在重试这段时间,一般是存在数据不一致性,一般是通过如下方式解决

  • 引入分布式锁,加锁,防止其他数据在访问,会降低并发性
多线程访问导致数据不一致问题
  • 因为同步缓存需要两步,分别是修改数据库和缓存,这两个步骤之间一般来说不会加锁,这样会降低并发性,不加锁就意味着会出现多线程访问问题,导致数据的不一致。
  • 按照更新数据库和缓存的先后,主要分为两种情况,这里具体讨论一下

1、先修改数据库,然后在删除缓存访问

时间线程1线程2问题
t1删除数据库中的数据a
t2读取缓存中的数据a,缓存命中,读取到不存在的旧值a线程1尚且没有完全删除缓存值,线程2读到缓存中的脏数据a
t3删除缓存中的数据a

在这里插入图片描述

  • 总结
    • 这种情况持续的时间会很短,因为仅仅只要线程1被切换回来,成功删除缓存中值,就能保证后续数据的一致性,并不需要额外的人工干预。影响小

1、先修改数据库,然后在删除缓存访问

时间线程1线程2问题
t1删除缓存中的数据a
t2读取缓存中的数据a,缓存没有命中,访问旧版数据库,重建缓存a1、线程1没有更新数据库的值,线程2会读到旧值;只要缓存不过期中间,后续所有线程读到的都是旧值
t3更新数据库中的数据a缓存中是旧值,数据库中是新值,两者不一样!

解决办法===延迟双删

  • 修改完数据库之后,再进行一次缓存删除操作,执行两次,保证的缓存的数据重建来自更新之后的数据库
  • 具体指令如下
redis.delKey(x);
db.update(x);
Thread.sleep(N);
redis.delKey(x);

在这里插入图片描述

总结
  • 推荐先删除数据库,再删除缓存,主要原因有以下两点
    • 先删除缓存再删除数据库,导致请求因为缓存缺失而访问数据库,给数据库带来压力
    • 延迟双删的时间不好确定
  • 如果对于数据一致性有强要求
    • 更新数据库的时候,暂停redis缓存发送请求,等都弄完了再发送

总结

  • 不总结不知道,之前知道的太浅薄了,关于redis了解的不够深刻,实际上数据不一致不仅仅是删除或者更新缓存那么简单,中间还会涉及到多线程的问题,因为多个更新数据库和删除缓存并不具有原子性,中间有可能被打断,所以需要分情况进行讨论。
  • 出现数据不一致的情况的以及对应的解决方式有两种,具体如下
数据不一致原因解决办法
删除redis执行失败消息队列重试
多线程导致数据不一致延迟双删策略

参考信息

缓存异常——如何解决缓存和数据库不一致的问题

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

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

相关文章

Git 的使用以及vscode 下git 的使用(一)

1、git 和svn Git 和 SVN 都是版本控制系统,它们都用于管理代码的版本,但它们之间有一些显著的区别: 分布式 vs 集中式:Git 是一个分布式版本控制系统,这意味着每个开发者都拥有整个代码库的完整副本,并且…

3DTiles —— 三维瓦片

文章目录 一、glTF二、3DTiles1.3dTiles的特点2.一个简单的3dTiles数据示例3.Tileset——(三维)瓦片数据集——.json顶级属性概览(必需):asset、root、geometricError其他属性root、children、refine、content、boundingVolumechildrenrefine 细化bounding volumes …

大棚分割数据集,40765对影像,16.9g数据量,0.8米高分二,纯手工标注(arcgis标注)的大规模农业大棚分割数据集。

数据集名称: )“Greenhouse Segmentation Dataset (GSD)” 数据集规模: 包含40,765对用于大棚分割的影像数据,每对影像包括一张原始图像和相应的分割标签图。 数据量: 总数据量约为16.9GB,适合存储在现…

推荐这款神器:Perplexity

今天推荐是一款AI搜索引擎,还支持gpt-4模型的使用,虽然4小时只能使用5次,但是相比于常规的搜索引擎,在某些方面还是很强的,个人感觉优于newbing。 页面简洁,没有广告,内容丰富,功能…

JVM面试真题总结(十)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 是否所有对象都分配在堆内存上? 在Java中,对象主要是…

SVM——支持向量机的学习入门

1、推荐文章 1、一文看懂SVM算法 2、图解机器学习|支持向量机模型详解 3、支持向量机的直观理解 2、分类问题 假设你的大学开设了一门机器学习(ML)课程。课程导师发现数学或统计学好的学生表现最佳。随着时间的推移,积累了一些数据&…

Mysql的高级查询:SQL关联查询(内连接/外连接/自连接)/子查询

一.关联查询: 定义:关联查询又叫连接查询 常见:内连接/外连接/自连接 1.内连接(无存在主从表) 语法:inner join ...on 定义:组合两个表的记录,返回关联字段相符的记录,也就是返…

【LeetCode】每日一题 2024_9_15 与车相交的点(差分)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 今天的题目曾经的我做过了 . . . 又是复习的一天 题目:与车相交的点 代码与解题思路 func numberOfPoints(nums [][]int) (ans int) { diff : [102]int{}for _, p : range nums {diff[p[0]]d…

Orchestrator 与 Mysql 8.0 的兼容性

一、看图识别问题 二、Mysql 8.0 从 MySQL 8.0.22 开始,使用SHOW REPLICA STATUS代替SHOW SLAVE STATUS,该语句从该版本开始已弃用。 所以:Mysql 8.0.22前可以用Orchestartor

InternStudio大模型之路(十七):销冠大模型案例实战

一、📢 简介 Streamer-Sales 销冠 —— 卖货主播大模型 是一个能够根据给定的商品特点从激发用户购买意愿角度出发进行商品解说的卖货主播大模型。以其独特的智能魅力,将彻底改变您的购物体验。该模型能深度理解商品特点,以生动、精准的语言…

NC输出二叉树的右视图

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 请根据二叉树…

QXDM 如何更新软件?

如何更新QXDM等高通软件?之前做过这个事情,但过几个月给别人讲的时候就忘记了,特做如下记录。 一. 背景知识: 1. QXDM 依赖于Qualcomm package Managers 3(QPM in short)。 目前的时间是2024年9月15日,但不知从何…

华为OD机试 - 找出作弊的人(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

门店引流神器异形创意LED圆形(饼/盘)显示屏使商业广告更有吸引力

在当今这个信息爆炸的时代,商业竞争日益激烈,如何在众多商家中脱颖而出,吸引顾客的注意力,成为了每个商家亟待解决的问题。而在这个视觉为王的时代,一种创新的门店引流神器——异形创意LED圆形(饼/盘&#…

【案例72】Apache检测到目标 URL 存在 http host 头攻击漏洞的解决方案

在网络安全中,我们经常会遇到各种漏洞和攻击,其中 http host 头攻击漏洞是一种比较常见的安全问题。最近,我在处理一个项目时,检测到目标 URL 存在 http host 头攻击漏洞,下面我将分享两种Apache解决这个问题的方法。 …

强烈建议!所有Python基础差的同学,死磕这本64页的背记手册

关于Python书籍的推荐,特别是针对Python背记手册这一类别,虽然直接名为“Python背记手册”的书籍可能不常见,但存在多本详尽的Python学习资料,旨在帮助学习者系统地掌握Python语言的基础知识和进阶技能,这些书籍或资料…

【stm32笔记】使用rtt-studio与stm32CubeMx联合创建项目

使用rtt-studio与stm32CubeMx联合创建项目 创建rt-thread项目 设置项目信息 在项目资源管理器中“右击“,创建RRT studio 项目 双击“RT-Thread 项目“。 选择MCU,设置UART,以及调试方式。添加项目名称,点击“完成“按钮。 …

python画图|极坐标下的3D surface

前述学习过程中,我们已经掌握了3D surface的基本绘制技巧,详见链接: python画图|3D surface基础教程-CSDN博客 基础教程中的3D surface绘制位于笛卡尔坐标系,但有时候会用到极坐标绘图。虽然我们已经学过简单的极坐标绘图技巧&a…

C++: 二叉树进阶面试题

做每件事之前都心存诚意, 就会事半功倍. 目录 前言1. 根据二叉树创建字符串2. 二叉树的层序遍历Ⅰ3. 二叉树的层序遍历Ⅱ4. 二叉树的最近公共祖先5. 二叉搜索树与双向链表6. 根据一棵树的前序遍历与中序遍历构造二叉树7. 根据一棵树的中序遍历与后序遍历构造二叉树8. 二叉树的…

AMD FSR 4已秘密开发1年 支持AI帧生成

作为当今三大超分技术之一,AMD FSR曾经在第二代一度紧紧咬住NVIDIA DLSS,但是进入第三代之后反而差距拉大了,尤其是帧生成技术差了很多。AMD高级副总裁、计算与图形业务事业部总经理Jack Huynh近日透露,FSR 2/3并不是AMD真正想要的…