您当前的位置:首页 > 电脑百科 > 数据库 > Redis

Redis 和 MySQL 数据一致性详解

时间:2023-03-09 15:05:10  来源:  作者:重庆源码时代

在实际开发过程中,我们经常会遇见在高并发的的情况下,大量的请求访问MySQL数据库,会造成性能安全问题。所以,我们很多时候会把数据写入到redis里面,用作缓存来减少数据库的压力,但是Redis 和 MySQL是两种不同类型的数据库,我们要怎样去保证它们之间的数据是一致性的呢?

数据不一致的原因

当数据并发量非常大的情况下,用户的并发访问会对数据库的安全造成极大的安全隐患。

因此,我们就需要使用到Redis来做一个缓存的操作,可以让用户请求先访问Redis,而不直接访问到数据库。

然后只是读取缓存操作的话,一般不会对数据库产生很大的问题,主要是涉及到数据的更新问题,数据库和缓存更新,就很容易出Redis 和 MySQL的数据一致性问题。

产生的问题

其实不管我们是先删除缓存,再写库还是先写库,再删除缓存,都有可能会出现数据不一致的情况:

先删除缓存

如果是删除Redis的缓存数据,在数据还没有写入MySQL数据库的时候,另一个线程就来读取缓存,就会发现这个缓存为空,然后会直接去MySQL数据库读取旧的数据并把数据写入缓存里面。这样,就会造成数据库更新后发现Redis和MySQL里面的数据不一致。

后删除缓存

如果是先把数据写入了MySQL里面,正准备删除缓存的时候,突然写入数据库的线程发生异常,导致了缓存并没有被删除。这个时候,另一个线程就会直接读取到旧的缓存数据,这也会导致Redis和MySQL里面的数据不一致。

解决方案

延时双删策略

这个方案主要是在写入数据的时候都进行缓存的删除操作,并且给它设置合理的超时时间。

具体操作:

1.先删除缓存 再写数据库

2.休眠几百毫秒 再次删除缓存

这么做的目的主要是为了确保这个请求结束后,有可能造成的缓存脏数据。这个方案最关键的其实还是给缓存设置过期时间,只要达到过期时间,缓存删除,如果后面还有读的请求,就会从数据库中读取新的值并且回填到缓存里面,这个是保证最终一致性的解决方案。

异步更新缓存

这个方案是基于Mysql binlog的同步机制,在设计的更新的数据操作的时候,利用Mysql binlog进行增量的订阅消费,然后将消息发送给消息队列,再通过消息队列消费将增量数据更新到Redis上面。

具体操作:

1.读取Redis缓存 写Mysql

2.更新Redis缓存数据,Mysql 的数据操作都记录到binlog,再通过下次队列及时更新到Redis缓存上

这样的好处是一旦Mysql 中发生了新的写入、更新、删除等操作,丢会通过binlog把相关消息推送到Redis里面,Redis会根据binlog中的操作记录对Redis进行更新,而且这种方案和Mysql 的主从备份很相像,毕竟Mysql 的主从备份也是通过binlog来实现的数据的一致性的。

总结

最后,在当前分布式高并发众多的场景下,解决高并发场景下数据一致性的方案有两种,分别是延时双删策略和异步更新缓存两种方案。



Tags:   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
16个Redis常见使用场景总结
来源:blog.csdn.net/qq_39938758/article/details/105577370目录 缓存 数据共享分布式 分布式锁 全局ID 计数器 限流 位统计 购物车 用户消息时间线timeline 消息...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
聊聊Rust里面的数据类型
嘿,朋友们!今天我们来聊聊Rust里面的数据类型。你知道吗?Rust的数据类型可是很重要的哦,它们帮助我们定义变量和函数可以处理什么样的数据。基本数据类型首先,让我们来看看Rust提...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
C++中的外部模板及其在当前编译文件中的实例化
在C++中,模板是一种泛型编程的工具,它允许程序员以一种类型无关的方式编写代码。然而,模板的一个常见问题是它们会导致编译时间增加,特别是在大型项目中,当多个源文件包含相同的...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
网络安全行业的春天何时来?
2023年下半年开始,网络安全从业人员都感受到了网安行业的寒冬,但是其实前奏并不是此刻,只是涉及到大量裁员关乎自身而人人感同身受。从近五年各个网络安全上市公司财报可以发现...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
Linux获取Redis 性能指标方法
一、监控指标Ø 性能指标:PerformanceØ 内存指标: MemoryØ 基本活动指标:Basic activityØ 持久性指标: PersistenceØ 错误指标:Error二、监...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
Redis与缓存一致性问题
缓存一致性问题是在使用缓存系统,如Redis时经常遇到的问题。当数据在原始数据源(如数据库)中发生变化时,如何确保缓存中的数据与数据源保持一致,是开发者需要关注的关键问题。一...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
10余所高校公布强基计划,今年有哪些变化?
今天,中国人民大学、中国农业大学、复旦大学、武汉大学、山东大学、吉林大学、重庆大学、大连理工大学发布了2024年强基计划招生简章。目前,已有10余所高校发布了招生简章。它...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
腾讯首款自研 Switch 游戏上线:《腾讯扣叮-编程第一课》
IT之家 4 月 11 日消息,腾讯 Nintendo Switch 今日官宣,Nintendo Switch 趣味编程学习软件 ——《腾讯扣叮-编程第一课》已于今日上架 Nintendo e 商店,建议零售价 4...【详细内容】
2024-04-11  Search:   点击:(2)  评论:(0)  加入收藏
▌简易百科推荐
16个Redis常见使用场景总结
来源:blog.csdn.net/qq_39938758/article/details/105577370目录 缓存 数据共享分布式 分布式锁 全局ID 计数器 限流 位统计 购物车 用户消息时间线timeline 消息...【详细内容】
2024-04-11    书圈  Tags:Redis   点击:(2)  评论:(0)  加入收藏
Linux获取Redis 性能指标方法
一、监控指标Ø 性能指标:PerformanceØ 内存指标: MemoryØ 基本活动指标:Basic activityØ 持久性指标: PersistenceØ 错误指标:Error二、监...【详细内容】
2024-04-11  上海天正信息科技有限    Tags:Redis   点击:(2)  评论:(0)  加入收藏
Redis与缓存一致性问题
缓存一致性问题是在使用缓存系统,如Redis时经常遇到的问题。当数据在原始数据源(如数据库)中发生变化时,如何确保缓存中的数据与数据源保持一致,是开发者需要关注的关键问题。一...【详细内容】
2024-04-11  后端Q    Tags:Redis   点击:(2)  评论:(0)  加入收藏
Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证
Redis 官方于21日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause...【详细内容】
2024-03-27  dbaplus社群    Tags:Redis   点击:(12)  评论:(0)  加入收藏
Redis“叛逃”开源,得罪了几乎所有人
内存数据库供应商Redis近日在开源界砸下了一块“巨石”。Redis即将转向双许可模式,并实施更为严格的许可条款。官方对此次变更的公告直截了当:从Redis 7.4版本开始,Redis将在Re...【详细内容】
2024-03-25    51CTO  Tags:Redis   点击:(10)  评论:(0)  加入收藏
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  后端Q  微信公众号  Tags:Redis   点击:(18)  评论:(0)  加入收藏
Redis不再 “开源”
Redis 官方今日宣布修改开源协议 —— 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause 开...【详细内容】
2024-03-21  OSC开源社区    Tags:Redis   点击:(9)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  编程技术汇    Tags:Redis   点击:(49)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  楼仔  微信公众号  Tags:Redis   点击:(40)  评论:(0)  加入收藏
工作中Redis有哪些好用的运维工具
工作中使用 Redis 时,如果大家公司没有专业运维,可能开发人员就会面临这些运维的工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维等等。本文我就从这三...【详细内容】
2024-02-06  waynaqua    Tags:Redis   点击:(56)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条