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

Redis 如何保持和 MySQL 数据一致

发布网友 发布时间:2022-10-14 00:22

我来回答

1个回答

热心网友 时间:2023-11-18 17:15

redis在启动之后,从数据库加载数据。

读请求:

不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取

写请求:

数据首先都写到数据库,之后更新redis(先写redis再写mysql,如果写入失败事务回滚会造成redis中存在脏数据)

在并发不高的情况下,读操作优先读取redis,不存在的话就去访问MySQL,并把读到的数据写回Redis中;写操作的话,直接写MySQL,成功后再写入Redis(可以在MySQL端定义CRUD触发器,在触发CRUD操作后写数据到Redis,也可以在Redis端解析binlog,再做相应的操作)

在并发高的情况下,读操作和上面一样,写操作是异步写,写入Redis后直接返回,然后定期写入MySQL

1.当更新数据时,如更新某商品的库存,当前商品的库存是100,现在要更新为99,先更新数据库更改成99,然后删除缓存,发现删除缓存失败了,这意味着数据库存的是99,而缓存是100,这导致数据库和缓存不一致。

解决方法:

这种情况应该是先删除缓存,然后在更新数据库,如果删除缓存失败,那就不要更新数据库,如果说删除缓存成功,而更新数据库失败,那查询的时候只是从数据库里查了旧的数据而已,这样就能保持数据库与缓存的一致性。

2.在高并发的情况下,如果当删除完缓存的时候,这时去更新数据库,但还没有更新完,另外一个请求来查询数据,发现缓存里没有,就去数据库里查,还是以上面商品库存为例,如果数据库中产品的库存是100,那么查询到的库存是100,然后插入缓存,插入完缓存后,原来那个更新数据库的线程把数据库更新为了99,导致数据库与缓存不一致的情况

解决方法:

遇到这种情况,可以用队列的去解决这个问,创建几个队列,如20个,根据商品的ID去做hash值,然后对队列个数取摸,当有数据更新请求时,先把它丢到队列里去,当更新完后在从队列里去除,如果在更新的过程中,遇到以上场景,先去缓存里看下有没有数据,如果没有,可以先去队列里看是否有相同商品ID在做更新,如果有也把查询的请求发送到队列里去,然后同步等待缓存更新完成。

这里有一个优化点,如果发现队列里有一个查询请求了,那么就不要放新的查询操作进去了,用一个while(true)循环去查询缓存,循环个200MS左右,如果缓存里还没有则直接取数据库的旧数据,一般情况下是可以取到的。

1、读请求时长阻塞

由于读请求进行了非常轻度的异步化,所以一定要注意读超时的问题,每个读请求必须在超时间内返回,该解决方案最大的风险在于可能数据更新很频繁,导致队列中挤压了大量的更新操作在里面,然后读请求会发生大量的超时,最后导致大量的请求直接走数据库,像遇到这种情况,一般要做好足够的压力测试,如果压力过大,需要根据实际情况添加机器。

2、请求并发量过高

这里还是要做好压力测试,多模拟真实场景,并发量在最高的时候QPS多少,扛不住就要多加机器,还有就是做好读写比例是多少

3、多服务实例部署的请求路由

可能这个服务部署了多个实例,那么必须保证说,执行数据更新操作,以及执行缓存更新操作的请求,都通过nginx服务器路由到相同的服务实例上

4、热点商品的路由问题,导致请求的倾斜

某些商品的读请求特别高,全部打到了相同的机器的相同丢列里了,可能造成某台服务器压力过大,因为只有在商品数据更新的时候才会清空缓存,然后才会导致读写并发,所以更新频率不是太高的话,这个问题的影响并不是很大,但是确实有可能某些服务器的负载会高一些。

img

搜索*(ID:芋道源码),可以获得各种 Java 源码解析。

并且,回复【书籍】后,可以领取笔者推荐的各种 Java 从入门到架构的书籍。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
64岁的老头感冒了,还喝一瓶啤酒,又喝3包感冒药,吃了3个阿莫西林消炎药... ...今天中午12点喝了一瓶啤酒,不会有反应死了吧? 喝一瓶啤酒吃药没事吧 养育孩子有哪些正确的方式? 联想电脑一开机就蓝屏怎么解决 光遇冥想任务怎么完成_冥想任务攻略 光遇 光遇云野的锦鲤池冥想怎么做? 光遇 光遇在滑冰场旁冥想的任务怎么做? 光遇在仙乡的金塔下冥想任务怎么做 任务达成方法介绍 光遇 光遇在禁阁的神坛旁冥想怎么做? 泸州市贝珥装饰设计有限公司怎么样? 火灾逃生"七十二字口诀"具体内容是什么 特岗教师可以选择地方吗 天津特岗教师都安排去哪里 oppo手机便签怎么设置表格 跑步训练的心率区间 为什么变压器要换相 请问九华山到池州的车最早有几点的车,我想分别知道公交和巴士的最早发车时间,谢谢 九华山景区有没有直接到池州市区的车? 麻烦问下从九华山回池州火车站,每天最晚的车是几点的 杨鸣美丽的妻子,晒1儿1女观赛照!“辽篮削他”的字迹,逗笑网友 杨鸣妻子身高 哪家银行有买汽油打折的信用卡呀 奶奶70大寿,作为孙子送什么礼物表达心意最好? 杨鸣老婆是谁啊? 天猫盒子3怎么安装电视直播软件 是钢化膜还是水凝膜好点 沟水为什么会感到满意呢? 关于李大钊的资料,满意另有重赏!!! 急求Wonder Girl的详细资料,越详细越好,满意必采 帮我推荐几首最新的好听的流行歌曲吧,谁的都行,谢谢哦 请问电影<寻找罗拉>里面第四分钟开始的那首歌曲叫什么? 《one day》歌曲创作背景及含义是什么 一群单身狗适合去哪里玩? 单身狗抱团是怎么样的一种体验?有没有什么有趣的事情? 身边的基友都是单身狗是一种什么样的体验? 一个单身汉给一群单身狗上课? 动画电影《了不起的菲丽西》台词 善变的人是什么意思 善变的人是啥意思 上海五官科医院浦江分院地铁几号线到 请问.mdi是什么格式的文件? 用什么软件打开? 谢谢! 山楂一年四季有吗 山楂是不是一年四季有 法国疫情怎么样现在 迈汇突发!法国将有上千趟航班取消,发生了什么?目前情况如何? 法国开门开空调或被罚款5000元!法国现在的能源问题怎么样了? 想问法国的治安怎么样 国际脸是遗传病吗 在C语言中通过scanf()输入的字母无法在printf()输出 小康金融坑货? 三年级古诗手抄报图片