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

缓存和数据库一致性问题

发布网友 发布时间:2024-09-26 20:08

我来回答

1个回答

热心网友 时间:2024-10-24 16:00

缓存和数据库如何保证一致性1. 问题提出

正常情况下,我们从客户端发起请求从数据库拿到数据

当客户端请求变多的时候,我们就会引入缓存来提高接口的性能

但是,由于请求的并发性和数据处理的顺序性,更新数据是很有可能导致缓存和数据库不一致的

那该如何操作才能保证数据库和缓存的一致性呢?

2. 四种情况下的分析

针对缓存和数据库一致性的问题,需要分以下四种情况

1??先更新数据库,再更新缓存场景

假设,这里有两个请求,请求a更新字段为1,请求b更新字段为2,那么有如下顺序:

请求a先更新数据库为1,然后请求b更新数据库为2

接着请求b更新缓存为2,最后请求a更新缓存为1

最终结果导致数据库为2,缓存为1,造成缓存和数据库不一致的问题

结论

不推荐使用这种方法

2??先更新缓存,再更新数据库场景

假设,这里有两个请求,请求a更新字段为1,请求b更新字段为2,那么有如下顺序:

请求a更新缓存为1,请求b更新缓存为2

请求b更新数据库为2,最后请求a更新数据库为1

最终结果导致数据库为1,缓存为2,造成缓存和数据不一致

结论

不推荐使用这种方法

Cache Aside策略

后两种要讨论的解决方案是根据Cache Aside策略(旁路缓存策略) 来进行制定的

旁路缓存策略是指,更新数据时(写策略) ,不更新缓存,而是删除缓存中的数据,然后到读取数据时(读策略) ,发现缓存中没了数据之后,再从数据库中读取数据,更新到缓存中

但是存在是先删除缓存再更新数据库还是先更新数据库再删除缓存的问题

3??先删除缓存,再更新数据库场景

假设,这里有两个请求,请求a需要更新字段为21,请求b需要读取字段,那么有如下顺序:

请求a先删除缓存,导致请求b的未命中缓存 (但是请求a还没完成对数据库数据的更新)

接着,请求b读取数据库的值,此时数据库为20,然后更新到缓存当中,此时缓存为20

最后,请求a姗姗来迟更新数据库为21

最终,导致缓存为20,数据库为21,造成缓存和数据不一致

解决方法——采用延时双删策略

上述情况就会导致不一致的情形出现。而且,如果不采用给缓存设置过期时间策略,该数据永远都是脏数据。

伪代码如下

public void write(String key,Object data){db.updateData(data);redis.delKey(key);Thread.sleep(1000);redis.delKey(key);}

解释:

(1)先更新数据库 ?(2)淘汰缓存 ?(3)休眠1秒,再次淘汰缓存

好处:这么做,可以将1秒内所造成的缓存脏数据,再次删除。

结论

不推荐使用这种方法!!

延迟双删一般是针对第三种情况,因为 "删除了缓存-->再更新完数据库" 期间的数据库更新比较慢,大概率有其他请求拿到旧数据放到缓存,所以可以更新完数据库可以休眠一下,然后再删除缓存,即延迟双删。不过这个休眠时间不太好确定,所以一般不推荐

4??先更新数据库,再删除缓存(推荐)场景

假设这里请求a需要读取字段,请求b需要更新字段为21,有如下顺序

首先请求a要读取数据,刚好未命中缓存,就接着去读取数据库,值为20 (此时请求a还没完成缓存更新工作)

此时,请求b进来了,更新数据库为21,然后删除了缓存

最后,请求a珊珊来迟,按照请求a的逻辑是要将20写入到缓存

最终,导致缓存为20,数据库数据是21,造成缓存和数据不一致

解决方法

但是上述这种情况是不太可能发生的,因为缓存的写入通常要远远快于数据库的写入

而一旦请求A早于请求B删除缓存之前更新了缓存,那么接下里的请求就会因为缓存不命中而从数据库中重新读取数据,所以不会出现数据库和缓存不一致的情况

另外,因为更新数据库和删除缓存不是原子性操作(指的是更新数据库和删除缓存一起的业务逻辑) ,如果删除缓存操作没完成,还是会出现不一致的情况,所以可以兜底给数据加入过期时间,那么不一致时间最多只到过期,可以达到最终一致性

结论

推荐使用这种方案

资料来源

面试官:缓存和数据库如何保证一致性

\

原文:https://juejin.cn/post/7103186288655728677
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 打算今天从扬州去镇江,明天玩一天,怎么去呢,镇江有什么山可以爬呢_百... 我的电话呼叫已限制是怎么回事? 手机被呼叫限制是怎么回事啊? 手机被呼叫受限是什么意思啊? 为什么有时候我的手机打电话会被限制呢? ...㎝,第一次用去它的一半少2㎝,第二次用去剩下的2/3还多1㎝。用代数... 怎样查看路由器是千兆还是百兆的? ...铁丝,第一次用去它的一半少2米,第二次用去剩余的1/3多2/3米,还剩... ...长2米,第一次用去3分之1米,第二次又用去剩下的5分3,还剩下多少米... 高中会考的等级是如何划分的? 高中会考成绩怎么划分的,有什么标准么? 安徽省会考是什么时间? 为什么洗脸的时候用洗面奶洗脸脸上会有刺痛的感觉 敷面膜涂水乳都不疼... 北京亚环影音制作有限公司简介 我收到北京亚洲汇恒电影传媒有限公司的面试邀请是会计助理实习的,会... 金马伯乐亚洲影视文化传媒(北京)有限公司 北京亚中华影文化传媒有限公司怎么样? i75500u和i54200u哪个好? 梦见大拇指甲掉了一大块肉,我还仔细看文理,肉质像牛肉,有一斤多... AutoCAD2007中文版功能介绍 虾皮白萝卜汤又叫什么名字 桐花万里丹山路雏凤清于老凤声的意思 桐花万里丹山路雏凤清于老凤声的... “桐花万里丹山路,雏凤清于老凤声”是什么意思_出处是哪里 雏凤清于老凤声是谁的诗作? 游戏王城之内篇汉化版中,我赢得的卡怎么使用?我玩了半天还是原本的卡组... 游戏王混沌力量城之内版 我下的这么一张卡都没有 《在异世界迷宫开后宫》为什么比肩《棍勇》?因为他们生猴子了啊_百度知... 《在异世界迷宫开后宫》无修版大火,要给漫画家冰树一世磕头 游戏王城之内的全卡档怎么用?我下了带全卡档的,也安了,可为什么用不了... 王者荣耀情侣名字大全 骚气可爱温馨ID汇总 王者荣耀:佛系英雄-庄周,玩好了输出可以有多恐怖,立马咸鱼翻身? 发芽时光护肤品的品质怎么样? 发芽时光卸妆油成分有哪些? 销售假药罪的主观方面的认定是什么? 非法销售假药罪司法解释主观认定标准是什么 恋爱的那点事儿电视剧全集1-38集在线观看有吗?迅雷下载的也可以的谢谢... 生产销售假药罪的主观方面是什么 销售假药罪主观明知的认定标准是什么? 生产销售假药罪的主观要件有哪些内容? ...下一站幸福DVD高清在线观看 电影下一站幸福迅雷下载