如何保证数据库的数据和Redis的数据一致性

news2024/11/23 13:51:16

实际项目中有可能会使用Redis缓存数据,那么在更新数据的时候如何保证数据库中的数据和Redis缓存的数据一致,缓存同步策略的选择是一个很重要的问题。网上有各种说法,大概总结有以下几种,看看每种方案是否可行以及存在的问题和适用场景。

1、先更新Redis,再更新数据库 (不可行 )

数据库是比较复杂的,而且还会涉及事务,因为超时等原因更新操作失败的可能性较大,这种方案很可能因为数据库更新失败,导致缓存和数据库的数据不一致。
在这里插入图片描述
如上图所示,如果第2步更新数据库失败了,那么缓存的数据被更新为20,和数据库值10不一致了。

这种情况可能会想到补救措施:数据库更新失败了再将Redis数据做逆向操作进行回退,但是如果Redis数据回退操作也失败了呢?甚至还要继续针对这种失败做重试?显然事情越做越复杂了,这种方式不可行。

2、先更新数据库,再更新Redis (部分场景可用,不推荐 )

上面的方案不可取,这种先更新数据库的是否就可行呢?假设有两个请求更新数据,时序图如下:
在这里插入图片描述

如果是并发量不高,对一致性要求没有特别高时,如上图更新完数据库再更新Redis没有问题。

在这里插入图片描述

如果是并发量较高,如图所示这种场景下虽然请求1和请求2先后完成数据库更新,但更新缓存时却是请求2和请求1的顺序,那就很可能会把旧数据更新到缓存中导致数据不一致。

3、先删除Redis,再更新数据库,访问的时候再加载数据到缓存 (不可行 )

这里同样以两个请求的场景为例,时序图如下:
在这里插入图片描述
从图上可以看到,当并发场景下如果请求1更新耗时较长,还未来得及更新数据库中的值,请求2已经先读取了旧值并加载到缓存中了。这种也会导致两边数据不一致,而且并发量很高的时候这种概率也会更大。

针对这个方案存在的问题可以在请求1更新完数据库后再对Redis做一次删除操作。也就是缓存双删

4、先删除Redis,再更新数据库,再删除Redis,访问的时候再加载数据到缓存(缓存双删)

在这里插入图片描述
这种方案一定程度上解决了方案4数据不一致的问题,但是也有一个关键点,如上图所示必须保证第6步删除缓存操作在第5步回写入缓存操作之后执行,否则还是会有问题。那么这又引出了另外两个问题:

  • 问题一:如何保证第二次删除缓存一定在回写后面执行呢?

关于双删的这个问题网上有方案是让请求1删除缓存时等待xxx毫秒,这个方案似乎可行,但是这个时间不好控制还是会存在一定风险。
另外也有博主给出的建议方案是将删除请求加入消息队列,异步串行化处理删除

  • 问题二:如果双删失败了怎么办?

同样的网上也有方案:给redis加一个缓存过期时间、删除加入消息队列利用消息队列的重试机制、自己记录删除失败进行重试等

5、先更新数据库,再删除Redis,访问的时候再加载数据到缓存

在这里插入图片描述
这种方案除了请求2第一次查询这一次不一致,还有另一个极端场景会存在数据不一致。请求1更新数据节点缓存刚好失效了,另一个请求2刚好这时读取缓存没有进而读了数据库旧值,如下图所示:
在这里插入图片描述
这个极端场景需要满足缓存更好失效,而且请求2读取数据库及回写缓存耗时较请求1更新数据库更长,发生的概率非常小,可以忽略,所以相比较而言,方案5是最推荐的处理策略。

通过以上几种处理方案的分析,可以看到不管哪种方案都存在一定的问题,在满足实时性的条件下,尽量保证不一致出现的概率更低,或者不一致持续的时间非常短暂,避免长期不一致。非要满足强一致性可能就需要考虑使用锁的方案了。

总的来说,针对缓存同步更推荐的方式是,缓存中的数据不由数据更新操作主动触发,统一在需要使用的时候按需加载,数据更新后及时删除缓存中的数据。

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

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

相关文章

思维导图模板下载网站有哪些?这6个网站优质模板任你选!

信息时代,有效的信息组织和知识管理变得尤其重要。思维导图,作为一种强大的视觉化工具,可以帮助我们整理和理解复杂的信息,提高工作和学习效率。 好的思维导图模板能帮助我们拓展思路、提升美观度、更快地完成思维导图的绘制。今…

【小梦C嘎嘎——启航篇】string介绍以及日常使用的接口演示

【小梦C嘎嘎——启航篇】string 使用😎 前言🙌C语言中的字符串标准库中的string类string 比较常使用的接口对上述函数和其他函数的测试代码演示: 总结撒花💞 😎博客昵称:博客小梦 😊最喜欢的座右…

好用的安卓手机投屏到mac分享

工具推荐:scrcpy github地址:https://github.com/Genymobile/scrcpy/tree/master mac使用方式 安装环境,打开terminal,执行以下命令,没有brew的先安装brew brew install scrcpy brew install android-platform-too…

Mybatis 源码 ① :开篇

文章目录 一、前言二、项目搭建三、自动装配四、总结 一、前言 Mybatis 官网 以及 本系列文章地址: Mybatis 源码 ① :开篇Mybatis 源码 ② :流程分析Mybatis 源码 ③ :SqlSessionMybatis 源码 ④ :TypeHandlerMybat…

ubuntu1804系统ROS1和ROS2一键装机

备忘一下ROS1和ROS2的一键装机 原网址:小鱼的一键安装系列 指令: wget http://fishros.com/install -O fishros && . fishros如果想同时安装ROS1和ROS2, 运行两次. fishros, 工具会自动将ROS1和ROS2放在不同的文件目录下 安装完每次打开终端时, 会提示选择ROS1还是RO…

【Linux】应用层协议

【Linux】应用层协议 文章目录 【Linux】应用层协议1、协议作用1.1 应用层需求1.2 协议分类 2、HTTP & HTTPS2.1 HTTP/HTTPS 简介2.2 HTTP工作原理2.3 HTTPS工作原理2.4 区别 3、URL3.1 编码解码3.2 URI & URL 4、HTTP 消息结构4.1 HTTP请求方法4.2 HTTP请求头信息 5、…

思维导图在线制作,10款好用的思维导图在线制作网站推荐!

思维导图的强大作用在于它以直观、易理解的图形方式展现信息,让复杂的内容变得简单明了,极大地提升了我们的学习和工作效率。与传统的手绘思维导图相比,在线思维导图制作工具更具有灵活性和实用性,它们提供了丰富的功能&#xff0…

00|Java中常见错误或不清楚

00. 多变量声明并初始化 同时声明同类型的多变量 String a "Hello", c "hello"; int x 5, y 5;01. 变量类型 01.0 浮点类型 默认是double类型,如果需要指定float类型,可以float f 1.0F; 01.1 类型装换 如果将大的类型转为…

立秋至 | 共建智慧城,秋日硕果时

一缕缕阳光洒向大地 一股股热浪迎面拂来 一声声虫鸣清脆悦耳 一片片黄叶轻声而落 一份份清凉沁入心间 一个个硕果接踵而至 跟随我们一起来回顾下 往期铭控小伙伴们 在助力建设智慧城市 做了哪些努力呢 都做了哪些项目呢 得到了多少客户的认可呢 Part 1 智慧消防 消防…

关于网络入侵检测领域使用Spark/Flink等计算框架做分布式

关于网络入侵检测领域使用Spark/Flink等计算框架做分布式 0、引言1 基于LightGBM的网络入侵检测研究2 基于互信息法的智能化运维系统入侵检测Spark实现3 基于Spark的车联网分布式组合深度学习入侵检测方法4 基于Flink的分布式在线集成学习框架研究5 基于Flink的分布式并行逻辑回…

【AHB】初识 AHB 总线

AHB 与 APB、ASB同属于 AMBA 总线架构规范,该总线规范由 ARM 公司提出。 目录 一、AHB 总线 二、AHB 总线组成 三、AHB 主从通信过程 一、AHB 总线 AHB(Advanced High Performance Bus),意为高级高性能总线,能将微控制器&…

excel 下载方法封装

1.首先需要拿到后端返回的URL下载地址 2.写个下载方法 // url 接口返回的下载地址。例如:https://cancer-research.oss-cn-beijing.aliyuncs.com/yuance-platform-permission/校内共享数据导入模板.xlsx // name 文件名称 例如: 校内共享数据导入模板 /…

Pytorch安装教程:最新保姆级教程

目录 概述 重要的事情说三遍:不需要装cuda、不需要装cuda、不需要装cuda 1.查看自己NVIDIA版本 2.创建一个conda 环境 3.安装pytorch 本文意在帮助即将步入深入学习领域的学子 在这之前首先你需要安装好anaconda,不懂的可以下面这篇文章 最新Anaco…

探索人工智能 | 智能推荐系统 未来没有人比计算机更懂你

前言 智能推荐系统(Recommendation Systems)利用机器学习和数据挖掘技术,根据用户的兴趣和行为,提供个性化推荐的产品、内容或服务。 文章目录 前言核心机器学习为什么说机器学习是智能推荐系统的基础呢? 数据挖掘数据…

布置Zabbix监控

一、在 Web 页面中添加 agent 主机 1.1打开Zabbix的Web页面 2.2在 Web 页面中添加 agent 主机 二、在 Web 页面创建自定义监控项模板 2.1创建模版

3.1 Qt样式选择器

本期内容 3.1 样式选择器 3.1.1 Universal Selector (通用选择器) 3.1.2 Type Selector (类型选择器) 3.1.3 Property Selector (属性选择器) 3.1.4 Class Selector (类选择器) 3.1.5 ID Selector (ID选择器) 3.1.6 Descendant Selector (后裔选择器) 3.1.7 Chil…

励志长篇小说《周兴和》书连载之十四 守诚信身负巨债

守诚信身负巨债 天色阴霾。看样子又要下雨了吧? 周兴和强打精神,送走了来谈业务的几个客人后,一下就瘫倒在了藤椅上,一动也不想动——几个月来没日没夜的工作,十几天以来在高原的奔波,他太疲惫了&#xff…

【C与C++的相互调用方法】

C与C的相互调用方法 C与C为什么相互调用的方式不同C中调用CC中调用C致谢 C与C为什么相互调用的方式不同 C 和 C 之间的相互调用方式存在区别,主要是由于 C 和 C 语言本身的设计和特性不同。 函数调用和参数传递方式不同:C 和 C 在函数调用和参数传递方面…

【力扣每日一题】88. 合并两个有序数组 双指针 辅助数组 8.13打卡

文章目录 题目思路代码 题目 88. 合并两个有序数组 难度: 简单 描述: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&am…

【Spark学习笔记】- 1Spark和Hadoop的区别

目录标题 Spark 是什么Spark and Hadoop首先从时间节点上来看:功能上来看: Spark or Hadoop Spark 是什么 Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Spark and Hadoop 在之前的学习中,Hadoop 的 MapReduce 是大家广为熟知的计算框架&…