问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

2020-05-16:如何保证redis和mysql数据一致?

发布网友 发布时间:2022-04-23 14:22

我来回答

2个回答

懂视网 时间:2022-05-03 03:22

DB查询,保存到缓存;

     更新缓存时,先更新数据库,再将缓存的设置过期(建议不要去更新缓存内容,直接设置缓存过期)。

 

   为什么不去更新缓存内容,而是设置缓存过期呢?

   答:我们先来了解两个概念

 

1.1. 缓存穿透

      缓存穿透是指查询一个数据库中一定不存在的数据,由于缓存是不命中时需要从数据库中查询,查不到数据则不写入缓存,这就将导致这个不存在的数据每次请求都要到数据库中查询,造成缓存穿透。

        你可以通俗的理解,直接把缓存穿透了,没有利用到缓存。。。

 

        举例:

         If(redis存在此key){

             查询redis值

}else{

  查询数据库,如果能查到数据,就写入到redis中

}

         这一段代码逻辑就会造成缓存穿透的恶果。。

         你想,假设这个查询数据库中永远没有值,那么这个redis中这个key是不是就不会创建,那么代码就永远只走查询数据库这段代码,跟redis没关系了。。

 

         解决缓存穿透很简单,就是数据库查询不到也要缓存结果,不过缓存结果赋值为空而已,但它的过期时间会很短,最长不超过五分钟。

         If(redis存在此key){

             Var redisValue=查询redis值

返回值

}else{

  查询数据库.

If(能查到数据){

就写入到redis中

}else{

    如果查询不到,也写到redis中,只不过值是空值

}

}

 

要注意的点:

 第一,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间 ( 如果是攻击,问题更严重 ),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。

 

第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为 5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。

第三,Insert时需要事先移除要查询的key,否则即便DB中有值也查询不到(当然也可以设置空缓存的过期时间)

1.2. 缓存雪崩

     如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。

      这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。

 

    解决方法

 

   1. 加锁排队. 限流-- 限流算法. 1.计数 2.滑动窗口 3.  令牌桶Token Bucket 4.漏桶 leaky bucket [1]

 

 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

 

 业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。

 

SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。

 

     2.数据预热

 

 

 

  可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀

 

     3.做二级缓存,或者双缓存策略。

 

     A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。

 

      4.缓存永远不过期

 

 这里的“永远不过期”包含两层意思:

 

    (1) 从缓存上看,确实没有设置过期时间,这就保证了,不会出现热点key过期问题,也就是“物理”不过期。

 

     (2) 从功能上看,如果不过期,那不就成静态的了吗?所以我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期.

 

 从实战看,这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。

 技术图片

 

 

 

1.3. 热点Key

     热点key:某个key访问非常频繁,当key失效的时候有大量的线程来构建缓存,导致负载增加,系统崩溃。

        解决办法:

1、使用锁,单机用synchronized,lock等,分布式用分布式锁

2、缓存过期时间不设置,而是设置在key对应的value里。如果检测到存的时间超过过期时间则异步更新缓存

3、在value设置一个比过期时间t0小的过期时间值t1,当t1过期的时候,延长t1并做更新缓存操作

4、设置标签缓存,标签缓存设置过期时间,标签缓存过期后,需要异步更新实际缓存

 

2、异步队列

   对于并发程度较高的,可采用异步队列的方式同步,可采用kafka等消息中间件处理消息生产和消费。

 

 技术图片

 

3、使用阿里的同步工具canal

 

canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。

 

起源:早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。

 

基于日志增量订阅&消费支持的业务:

 

数据库镜像

数据库实时备份

多级索引 (卖家和买家各自分库索引)

search build

业务cache刷新

价格变化等重要业务消息

 

简单来说,Canal 会将自己伪装成 MySQL 从节点(Slave),并从主节点(Master)获取 Binlog,解析和贮存后供下游消费端使用。Canal 包含两个组成部分:服务端和客户端。服务端负责连接至不同的 MySQL 实例,并为每个实例维护一个事件消息队列;客户端则可以订阅这些队列中的数据变更事件,处理并存储到数据仓库中

 

 

原理相对比较简单:

  1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
  3. canal解析binary log对象(原始为byte流)

 

 

 技术图片

技术图片

 

Redis和数据库一致性

标签:镜像   读数   性能   价格变化   mem   add   实现   备份   后台   

热心网友 时间:2022-05-03 00:30

保证一致性的做法就是用某种分布式协议一致性来做:

1、SAGA或者TCC - 这两种需要业务代码的大量配合。通过业务代码来补偿一致性。

2、 现实当中有XA协议。比如Ehcache是支持XA协议的。但是性能表现不佳,运维也麻烦。

3、基于Paxos或者Raft的分布式锁,然后对Redis和DB进行双写

2020-05-16:如何保证redis和mysql数据一致?

保证一致性的做法就是用某种分布式协议一致性来做:1、SAGA或者TCC - 这两种需要业务代码的大量配合。通过业务代码来补偿一致性。2、 现实当中有XA协议。比如Ehcache是支持XA协议的。但是性能表现不佳,运维也麻烦。3、基于Paxos或者Raft的分布式锁,然后对Redis和DB进行双写 ...

Redis 如何保持和 MySQL 数据一致

在并发高的情况下,读操作和上面一样,写操作是异步写,写入Redis后直接返回,然后定期写入MySQL 1.当更新数据时,如更新某商品的库存,当前商品的库存是100,现在要更新为99,先更新数据库更改成99,然后删除缓存,发现删除缓存失败了,这意味着数据库存的是99,而缓存是100,这导致数据库和缓存不一致。

如何保证数据库与redis缓存一致的

为了保证数据库与Redis缓存一致,通常采用以下几种方法:1. 使用主从复制:在数据库中配置主从复制,使Redis从数据库中获取数据,从而实现与数据库数据一致。2. 使用发布订阅模型:Redis可以作为消息队列使用,将数据库中的更新信息发布到Redis中,所有的订阅者都会收到这个更新信息,从而实现数据的同步。3....

NineData,稳定、高效的Redis数据同步解决方案

NineData支持自建、多云、混合云平台下的Redis服务同步,覆盖单机、哨兵、集群等不同架构。在同步过程中,NineData具备数据对比与修复能力,确保源与目标数据一致。通过库映射功能,可实现多个Redis实例数据同步至单个实例,与MySQL多源复制类似。应用场景包括Redis版本升级、单机模式向集群模式迁移、集群模式向单...

借助Canal实现MySQL数据库间链接canal链接mysql

1、数据实时同步 提供不同数据存储的数据实时同步,如 MySQL 到 Elasticsearch 的同步,实时更新数据,保持数据一致 2、数据订阅 对于需要全量数据同步的场景,结合 snapshot 快照机制,可以实现数据全量订阅 3、实时数据分析 对数据实时抓取,进行数据分析计算 4、缓存更新 将数据更新到Cache(如Redis)中,...

Java培训的主要内容是什么?

4. 数据库与JDBC:学习数据库的基本概念、SQL语言以及使用Java连接数据库的方法。掌握如何通过JDBC与关系型数据库进行交互,实现数据的增删改查操作。5. Web开发技术:学习JavaWeb开发的基本知识,包括Servlet、JSP、MVC框架(如Spring、SpringMVC)等。通过实践项目,掌握Web应用的开发流程和常用技术。6. ...

自学Java怎么入门?

例如:MySQL、oracle、redis、MongoDB等。数据库学习完毕后,可以将数据存储到数据库中,也可以通过SQL语句从数据库中查询数据,结合Java项目可以实现动态站点的数据的保存。技术树 三、前端技术 Javaweb阶段包括前端、数据库和动态网页。Javaweb是互联网项目的入门课程,是学习后面高进阶课程的基础。首先,...

学习java难吗?一般要学多久?

之后就要看你想去做哪个方向了,做 Web 的话就要学一些框架和数据库了,框架方面建议先从 Spring 开始着手,这是目前大多数做项目都用到的框架,之后把数据库也要学习了,比较常用的有 MySQL、Mongodb、Redis 等等。当然随着学习的深入也要把相关的概念性知识补齐,比如 MVC、ORM、IOC 啊等等,很多时候需要用到单元...

联想ideapad300-15isk加内存条

换内存条很简单,只需要把下图红圈圈的两个螺丝卸下,然后往下推(不要掰),就可以取下后盖 步骤阅读 2 按下图箭头指示,取下原内存条,新内存条斜插,然后按下,完成,只换内存到这里就结束了,剩下的就是把盖子装回去 步骤阅读 END 1 把下图红圈圈的两个螺丝卸下,然后往下推(不要掰),就可以取下...

如何保证redis和数据库一致 redis集群如何保证线程安全 redis和mysql结合使用 redis和mysql区别 redis和mysql优缺点 redis与mysql redis为什么比mysql快 redis mysql完美结合 redis持久化到mysql
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
胶原蛋白线双眼皮是不是永久性 双眼皮埋线是蛋白质还是尼龙绳-双眼皮埋线蛋白线多久能吸收 人体输液的“港口”完全植入式输液港 双眼皮宽变窄修复的方法 同心保家庭重疾险靠不靠谱?便宜吗? 做完双眼皮一宽一窄怎么办 喝全脂奶粉对长高有没有什么好处? redmine中“选择一个项目..."下拉列表框中为什么只列出一个项目,我建... 南充市龙门中学实力现在怎样?他的奥赛班是重点班么? 感情中为什么总是不知足呢? redis和mysql区别是什么? win7系统遇到远程桌面超出了最大允许连接数的问题如何解决 局域网中,访问数量有上限怎么解决? win7连接数限制怎么解决 共享盘超出最大连接数?怎么解决? 停牌和停市(停盘)是一个意思吗 梦见和自己的弟弟打拳击? 我做梦自己和别人打拳,一个人给我缠绑手带的时候,直接把我的右手中指从根部断了没有见血这是什么含义呢 男士梦见自己理光头和别人打拳击 股票停牌是什么意思?为什么股票会停牌? 梦见打拳击比赛把人打死了? 梦见训练拳击? 好几天都梦见在打拳击或者是练拳击,有时候睡着了手还会打被子,我是不是要疯了? 做梦梦到和朋友一人打一拳是什么意思? 梦到和王思聪打拳击,寓意什么? 没练过,梦到参加搏击比赛 梦见自己和别人练拳击,貌似自己还很厉害,求解,本人女,不会打架 梦见小男孩打拳,生龙活虎 梦见和别人打拳击对手怕我,我太强壮了? 新手机如何恢复微信聊天记录?(之前未做备份) 如何用redis存储mysql数据和关联关系 怎么把mysql的数据缓存进redis 怎么把redis数据库里的数据存到mysql数据库里 redis怎么作为mysql的缓存 HEIC是什么格式,在电脑上如何打开? 一般无线上网的网络带宽是多少M 一般家用无线网安装要多少兆? heic用什么软件打开,heic格式图片怎么打开呢? 无线网的最大网速能有多少? 移动宽带送的网关的无线网络一般都是多少兆? 无线路由器多少兆的好 电信的无线上网一般是多少兆的速度? 图片是heic格式如何打开? 一般家用无线网几兆就可以了?就手机用! 无线网络速度144Mbps是多少兆宽带 无线网卡网速,最高有多少兆?。要装wifi咋装? 现在的家用的无线网最快的是多少兆!最慢的又是多少兆 手机卡消磁了 怎么办? 黑色泰迪脖子下有白色的还有胸口上都有白色的毛算不算泰迪还是算串串? 手机卡消磁了怎么办?