数据库和缓存一致性问题

hello,各位小伙伴们大家好,我是颜书凌,下面给大家讲解一下数据库和缓存的一致性问题,话不多说

1、一致性介绍

一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。

  • 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大
  • 弱一致性:这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态
  • 最终一致性:最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型。

2、问题来源

使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库:

读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)之间的数据一致性问题。

不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写数据库,都有可能出现数据不一致的情况。

3、举例说明

我这里举两个个例子:

1、先更新MySQL,再更新Redis

如果更新Redis失败,可能仍然不一致

2、先删除Redis缓存数据,再更新MySQL

再次查询的时候再将数据添加到缓存中,这种方案能解决1方案的问题,但是在高并发的场景下,性能较低,而且仍然会出现数据不一致的问题,比如线程1删除了Redis缓存数据,正在更新MySQL,此时另外一个查询再次请求,那么就会把MySQL中的老数据又同步到Redis中。

原因:因为读和写实并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题

4、解决方案

a. 延迟双删

    先删除Redis缓存数据,再更新MySQL,延迟几百毫秒再删除Redis缓存数据,这样就算再更新MySQL时,有其他线程读了MySQL,把老数据读到了Redis中,那么也会被删除掉,从而把数据保持一致。

出现的问题:延迟双删,所延迟的时间非常的难以确定,所以并不推荐延迟双删。即使先修改数据库,在删除缓存,还是有一定的时间会导致读取到旧数据。还有如reids删除失败等一系列问题

b.队列+重试机制

       

步骤:

更新数据库数据

缓存因为某种原因或者问题删除失败

将需要删除的key发送至消息队列

自己消费消息,获取需要删除的key

继续重试删除操作,直到成功

缺陷:虽然保证了数据的最终一致性,但是会对业务线的代码造成大量的侵入。

c.异步更新缓存(基于订阅binlog的同步机制)

       

MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis,Redis再根据binlog中的记录,对Redis进行更新。

其实这种机制,很类似MySQL的主从备份机制,因为MySQL的主从备份也是通过binlog来实现的数据一致性

5、实际应用

使用阿里的一款开源框架canal,通过该框架可以对MySQL的binlog日志进行监控,而canal正是模仿了mysql的slave数据库的备份请求,使的Redis的数据更新达到了相同的效果,MQ的消息中间件可以采用rabbitMQ来实现推送

本篇文章到此就结束啦,希望对你有所帮助

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

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

相关文章

基于vmware虚拟机中yum源的配置

1.首先需确保虚拟机中已经连接了光盘映像(如图在虚拟机右下方从左往右第二个) 2.在虚拟机中找到光盘映像文件(默认在/dev的sr0) 3.将光盘文件挂载(挂载后才可读取) 为方便每一次开机之后自动挂载&#xff…

类和对象【四】运算符重载

文章目录 运算符重载的概念运算符重载(函数)返回值类型:任意类型函数名:operator已有操作符 运算符重载(函数)的特点和注意点3个比较特殊的运算符重载赋值运算符()重载返回值类型和返…

未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势

文章目录 一、人工智能的定义和概述1. 人工智能的基本概念2. 人工智能的发展历史 二、技术深入:机器学习、深度学习和神经网络1. 机器学习2. 深度学习3. 神经网络 三、人工智能的主要目标和功能1. 自动化和效率提升2. 决策支持和风险管理3. 个性化服务和预测未来 本…

vulnhub靶场之FunBox-2

一.环境搭建 1.靶场描述 Boot2Root ! This can be a real life scenario if rockies becomes admins. Easy going in round about 15 mins. Bit more, if you are find and stuck in the rabbit-hole first. This VM is created/tested with Virtualbox. Maybe it works with…

【tcl脚本实践Demo 1】文本生成、匹配、修改、读写

引言 在芯片设计的流程中,各种EDA工具在设计、综合、布局布线、验证、时序分析等等环节都会产出大量的文件信息。这些信息是海量的,如果单纯靠程序员自己查看信息效率很低并且很容易纰漏。所以脚本语言可以很好的解决这个问题,可以利用脚本语言匹配到敏感的信息,完成对信息…

WindowSurfaceController method call stacktrace

WindowSurfaceController: prepareToShowInTransaction showRobustly

python判断大图中包含小图并输出位置总结

python判断大图中包含小图并输出位置总结 没啥可说的,项目遇到了就直接上代码,可以减轻劳动力,花最少得时间实现应用功能。 import cv2 # 读取大图片和小图片的路径 img_big cv2.imread(big_image.png) img_small cv2.imread(small_image…

华为手机 鸿蒙系统-android studio识别调试设备,开启adb调试权限

1.进入设置-关于手机-版本号,连续点击7次 认证:有锁屏密码需要输入密码, 开启开发者配置功能ok 进入开发者配置界面 打开调试功能 重新在androd studio查看可运行running devices显示了, 不行的话,重启一下android …

AI诗歌创作

诗歌作为一种文学形式,能够通过优美的语言和深刻的意境表达情感和思想,触动人心,引发共鸣。然而,如今随着生活节奏的加快和人们对实用性的追求,写诗这一传统艺术渐渐被人们所忽略。幸运的是,随着人工智能技…

一本通-1225:金银岛

【题目描述】 某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同…

Spring Cloud Feign

序言 本文给大家介绍一下 Spring Cloud Feign 的基础概念以及使用方式。 一、远程调用 在传统的单体系统中,我们通常是客户端去请求服务端的接口。但是在分布式的系统中,常常需要一个服务去调用另外一个服务的接口。在服务端如何去调用另外一个服务端…

搭建MongoDB副本集

文章目录 一、什么是MongoDB的副本集二、副本集的架构三、副本集的成员四、部署副本集1、节点划分2、安装MongoDB2.1、下载解压安装包 3、创建主节点3.1、创建存储数据和日志的目录3.2、新建配置文件3.3、启动节点服务 4、创建副本节点4.1、创建存储数据和日志的目录4.2、新建配…

普通电机与变频电机区别

普通电机和变频电机之间的区别: 1. 设计和构造: - 普通电机:设计用于在恒定的电源频率和电压下工作,通常具有固定的转速和功率。 - 变频电机:专门设计用于与变频器配合使用,能够在变化的频率和电压下运行&…

大模型公开可用的模型检查点或 API

文章目录 公开可用的模型检查点或 APILLaMA 变体系列大语言模型的公共 API 公开可用的模型检查点或 API 众所周知,大模型预训练是一项对计算资源要求极高的任务。因此,经过预训练的公开模型检查点(Model Checkpoint)对于推动大语言…

精简函数栈帧:优化创建和销毁过程的完全解析(建议收藏,提升内功)

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 【前文】一、函数栈帧的概念(stack frame&#xff…

win10部署本地大模型langchain+ollama

一、环境 windows10、Python 3.9.18、langchain0.1.9 二、ollama下载 Download Ollama on Windows 0.1.33版本链接https://objects.githubusercontent.com/github-production-release-asset-2e65be/658928958/35e38c8d-b7f6-48ed-8a9c-f053d04b01a9?X-Amz-AlgorithmAWS4-H…

一键切换ip地址的软件哪个好用

随着互联网的快速发展,IP地址的重要性日益凸显。它不仅代表着每台设备在网络上的唯一标识,还关乎到我们的网络隐私、访问权限以及工作效率。一键切换IP地址的软件应运而生,为我们提供了极大的便利。那么,在众多选择中,…

前端 JS 异常那些事

前言 人无完人,所以代码总会出异常的,异常并不可怕,关键是怎么处理 什么是异常 程序发生了意想不到的情况,影响到了程序的正确运行 从根本上来说,异常就是一个普通的对象,其保存了异常发生的相关信息&a…

《罪与罚》读后感

陀思妥耶夫斯基和列夫托尔斯泰是公认的俄国文学黄金时代的两座高峰,分别代表着俄国文学的“深度”和“广度”。列夫托尔斯泰的鸿篇巨著《复活》《安娜卡列尼娜》等等都已经拜读过,但陀思妥耶夫斯基的作品却一本也没有看过,实在是有点遗憾。这…

JUC并发-共享模型-工具-线程池

1、自定义线程池 每创建一个线程资源,就要占用一定的内存; ①如果是高并发场景,一下子来了很多任务,如果为每个任务都创建一个线程,对内存占用较大,甚至可能出现OOM。 ②大量任务来了,创建了很…