首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
Redis如何与数据库保持双写一致性?
[问答题]
Redis如何与数据库保持双写一致性?
查看答案及解析
添加笔记
求解答(0)
邀请回答
收藏(183)
分享
纠错
72个回答
添加回答
56
牛客793464225号
共有四种同步策略:1.先更新数据库再更新缓存。缺点:多线程并发下会存在数据库中数据和缓存不一致的的现象。可能出现2.先更新缓存在更新数据库,优点就是每次数据变化都可以及时的更新缓存,但是消耗很大,影响服务器性能。3.先删除缓存在更新数据库。缺点:也会导致缓存和数据库数据不一致。4.先更新数据库再删除缓存。缺点仍然可能存在缓存和数据库中数据不一致的情况,但是,我们可以使用重试机制进行操作。,所以说这是效果最好的解决方案。
编辑于 2022-05-24 19:32:55
回复(1)
17
Chaos1874
保证双写一致性共有四种方案:1,先更新缓存,在更新数据库,该方式的优点是能够保证数据访问是都会命中redis,降低数据库压力。缺点是每次修改都会操作缓存降低了服务器的性能。2,先更新数据库,再更新缓存:缺点是可能导致数据库和redis中的数据不一致(数据库更新成功,redis更新失败)。3,先删除redis,再更新数据库。缺点:可能导致数据库和redis中的数据都是旧数据(删除redis后,再更新数据时失败了)4,先更新数据库再删除redis。缺点:可能导致数据库和redis的数据不一致(redis删除失败)。出错时使用重试机制异步重新处理。
发表于 2022-06-21 20:44:39
回复(0)
15
番茄酱要加满
先更新数据库再删除缓存,若有错误需要重试
发表于 2022-05-12 10:32:45
回复(0)
11
牛客139432088号
先更新数据库,再删除缓存。如果失败,采用重试机制
发表于 2022-05-12 11:46:44
回复(0)
7
岑溪123
1、先更新数据库再删除缓存:写操作在更新数据库的时候,执行查询的线程直接获取缓存中的值与数据库中的不一致。2、先删除缓存再更新数据库:写操作在删除缓存还没执行更新数据库的时候,执行查询的线程发现缓存为空然后读取数据库中的旧值同步到缓存中,造成了缓存中的值为脏数据。3、延迟双删策略:先删除缓存然后更新数据库然后根据业务自定义延迟时间再删除缓存就能避免上述情况发生。但是会降低吞吐量。双删失败处理(1):双删策略+缓存超时设置,所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。这样做最差的情况就是在过期时间内由于删除失败再次读取数据会读取到reids中的旧数据。(2)重试方案:重试方案有两种实现,一种在业务层做,另外一种实现中间件负责处理。①再次删除失败时,将需要删除的key发送至消息队列,然后自己消费key值,继续重试删除操作,直到成功。该方案有一个缺点,对业务线代码造成大量的侵入。②更新数据库数据完成时数据库会将操作信息写入binlog日志当中,订阅程序去提取出所需要的数据以及key,另起一段非业务代码获得该信息然后尝试删除缓存操作,如果发现删除失败将这些信息发送至消息队列然后重新从消息队列中获得该数据,重试操作。
编辑于 2023-03-16 16:31:28
回复(0)
4
bobo260
先更新数据库,后删除缓存,如果出错,则会进行重试!
发表于 2022-07-27 11:38:52
回复(0)
3
拒绝无效加班的三文鱼很爱看电影
同步操作可分为几种进行讨论: 1、是删除缓存还是更新缓存?更新缓存的话,每一次对数据库的更新都要对缓存进行更新,无效的写操作较多;删除缓存,更新数据库时让缓存失效,查询时再更新缓存。 2、先改数据库还是先删除缓存?如果先删除缓存,再更新数据库的话,当更新操作与读操作并发,更新操作先把缓存删除,此时读操作再缓存中未找到数据,进而去数据库中查找,然后读取到旧数据并保存于缓存中,这就会造成持续的脏读。所以需要先更新数据库再修改缓存,此时在更新数据库时,可能也会读到旧数据,但不会持久的影响。如果删除缓存失败则采用重试机制解决。
发表于 2022-07-18 21:14:17
回复(0)
2
说又不是不能用的母单花很忧伤
1、先更新数据库在更新缓存
编辑于 2022-11-09 16:47:55
回复(0)
2
huanzi
先更新数据库再删除缓存,缓存删除失败需要重试
发表于 2022-05-23 20:39:57
回复(0)
1
wjm_lzy
1.
Cache-Aside Pattern(缓存旁路模式)
先更新数据库,再删除数据库缓存
2.
Write-Through Pattern(写穿透模式)
先更新 Redis 缓存,再更新数据库,
若任一环节失败,需触发重试或回滚
3.
Write-Behind Pattern
(写回模式)
只更新 Redis 缓存,记录 “缓存更新日志,然后
后台线程或消费者监听日志,异步批量更新数据库。
4. 消息队列
将写操作请求放入消息队***保单线程消费,按顺序执行 “更新数据库 + 删除缓存”
5. redis订阅binlog日志
发表于 2025-10-15 23:35:51
回复(0)
1
layiuuu
常见的双写一致性方案有四种 先写数据库再删缓存 可以避免脏读,下一次读取时再重新写入缓存; 缺点:极短时间内可能出现缓存穿透,可配合加锁/延时双删优化 延时双删策略 先修改数据库,然后删除缓存,延迟一段时间后再次删除缓存; 可以防止并发请求在第一次删缓存与更新数据库之间将旧数据写入缓存; 可以用于延迟队列 异步消息队列 修改数据库,发送消息,由消费者异步更新/删除缓存 可以减少耦合,适合高并发场景 缺点是:非强一致性、可能存在消息丢失问题 采用Canal等binlog机制 监听MySQL的Binlog变更,异步同步数据到redis
发表于 2025-05-08 00:05:33
回复(0)
1
Pitch_cha
先更新数据库再删除缓存,若有错误需要重试。
发表于 2023-04-10 14:27:42
回复(0)
1
浪仙_
常见的四种保证MySQL与Redis一致性的问题,在单线程下没问题,如果是多线程并发下,这四种都不可保证,比较好的策略是牺牲一些性能,做 延时双删。
发表于 2022-12-22 15:51:28
回复(0)
1
牛客453251138号
共有四种同步策略:1.先更新数据库再更新缓存。缺点:多线程并发下会存在数据库中数据和缓存不一致的的现象。可能出现2.先更新缓存在更新数据库,优点就是每次数据变化都可以及时的更新缓存,但是消耗很大,影响服务器性能。3.先删除缓存在更新数据库。缺点:也会导致缓存和数据库数据不一致。4.先更新数据库再删除缓存。缺点仍然可能存在缓存和数据库中数据不一致的情况,但是,我们可以使用重试机制进行操作。,所以说这是效果最好的解决方案。
发表于 2022-11-28 14:44:46
回复(0)
1
勤劳的考拉拒绝pua
还有个延迟双删机制
发表于 2022-09-28 09:05:15
回复(1)
0
在西红柿
tcc是最终一致性
发表于 2026-01-03 09:46:02
回复(0)
0
可见光
1、先更新数据库再更新缓存,缺点是会存在数据不一致的情况 2、先更新缓存再更新数据库,缺点是性能压力大 3、先删除缓存,再更新数据库。缺点是可能出现缓存和数据库中的数据都已过期 4、先更新数据库,再删除缓存,利用重试机制可以避免数据不一致。
发表于 2025-12-26 09:54:05
回复(0)
0
整顿职场的奇亚籽很坚定
通常先写库,再删缓存
发表于 2025-12-25 16:18:35
回复(0)
0
小别墅是毛坯
采用延迟双删的策略,先更新数据库,更新之前先删除缓存,更新后再删除缓存,消息队列更新,先更新数据库 发生mq消息更新删除更新缓存
发表于 2025-11-11 11:07:22
回复(0)
0
夜斗小神社
先更新数据库,在删除缓存。 通过mq异步更新缓存。
发表于 2025-10-20 15:42:39
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
Redis
上传者:
real1993
难度:
72条回答
183收藏
3543浏览
热门推荐
相关试题
下面关于Redis 6.0版本中的...
Redis
评论
(2)
下面关于Redis的定义和特点,正...
Redis
评论
(3)
下面关于Redis中的操作命令,错...
Redis
评论
(4)
电路如图所示,RL为负载电阻, 则...
模拟电路
评论
(1)
下面选项中,哪些 Go 程序代码不...
Go
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题