Java中如何保证缓存一致性问题.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

Java中中如如何何保保证证缓缓存存⼀⼀致致性性问问题题

⽬⽬录录

前⾔:

⽅案分析

⽅案⼀:更新缓存,更新数据库

⽅案⼆:更新数据库,更新缓存

⽅案三:删除缓存,更新数据库

⽅案:更新数据库,删除缓存

⽅案对⽐

总结

推荐⽅案

延迟双删

实际场景

写缓存策略

读缓存策略

注意

前前⾔⾔::

⼀道之前的⾯试题:

如何保证缓存和数据库的⼀致性?

下⾯介绍⼏种⽅案(⼤家回答的时候最好根据⾃⼰的业务,结合下⾯的⽅案)

⽅⽅案案分分析析

更新缓存策略⽅式常见的有下⾯⼏种:

先更新缓存,再更新数据库

先更新数据库,再更新缓存

先删除缓存,再更新数据库

先更新数据库,再删除缓存

下⾯⼀⼀介绍!

⽅⽅案案⼀⼀::更更新新缓缓存存,,更更新新数数据据库库

这种⽅式可轻易排除,因为如果先更新缓存成功,但是数据库更新失败,则肯定会造成数据不⼀致。

⽅⽅案案⼆⼆::更更新新数数据据库库,,更更新新缓缓存存

这种缓存更新策略俗称双写,存在问题是:并发更新数据库场景下,会将脏数据刷到缓存

updateDB();

updateRedis();

举例:如果在两个操作之间数据库和缓存⼜被后⾯请求修改,此时再去更新缓存已经是过期数据了。

⽅⽅案案三三::删删除除缓缓存存,,更更新新数数据据库库

存在问题:更新数据库之前,若有查询请求,会将脏数据刷到缓存

deleteRedis();

updateDB();

举例:如果在两个操作之间发⽣了数据查询,那么会有旧数据放⼊缓存。

该⽅案会导致请求数据不⼀致

如果同时有⼀个请求A进⾏更新操作,另⼀个请求B进⾏查询操作。那么会出现如下情形:

请求A进⾏写操作,删除缓存

请求B查询发现缓存不存在

请求B去数据库查询得到旧值

请求B将旧值写⼊缓存

请求A将新值写⼊数据库

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

⽅⽅案案::更更新新数数据据库库,,删删除除缓缓存存

存在问题:在更新数据库之前有查询请求,并且缓存失效了,会查询数据库,然后更新缓存。如果在查询数据库和更新缓存之

间进⾏了数据库更新的操作,那么就会把脏数据刷到缓存

updateDB();

deleteRedis();

举例:如果在查询数据库和放⼊缓存这两个操作中间发⽣了数据更新并且删除缓存,那么会有旧数据放⼊缓存。

假设有两个请求,⼀个请求A做查询操作,⼀个请求B做更新操作,那么会有如下情形产⽣

缓存刚好失效

请求A查询数据库,得⼀个旧值

请求B将新值写⼊数据库

请求B删除缓存

请求A将查到的旧值写⼊缓存

如果发⽣上述情况,确实是会发⽣脏数据。但是发⽣上述情况有⼀个先天性条件,就是写数据库操作⽐读数据库操作耗时更短

不过数据库的读操作的速度远快于写操作的

因此这⼀情形很难出现。

⽅⽅案案对对⽐⽐

⽅案1和⽅案2的共同缺点:

并发更新数据库场景下,会将脏数据刷到缓存,但⼀般并发写的场景概率都相对⼩⼀些;

线程安全⾓度,会产⽣脏数据,⽐如:

线程A更新了数据库

线程B更新了数据库

线程B更新了缓存

线程A更新了缓存

⽅案3和⽅案4的共同缺点:

不管采⽤哪种顺序,2种⽅式都是存在⼀些问题的:

主从延时问题:不管是先删除还是后删除,数据库主从延时可能导致脏数据的产⽣。

缓存删除失败:如果缓存删除失败,则都会产⽣脏数据。

问题解决思路:延迟双删,添加重试机制,下⾯介绍!

更新缓存还是删除缓存?

1.更新缓存缓存需要有⼀定的维护成本,⽽且会存在并发更新的问题

2.写多读少的情况下,读请求还没有来,缓存以及被更新很多次,没有起到缓存的作⽤

3.放⼊缓存的值可能是经过复杂计算的,如果每次更新,都计算写⼊缓存的值,浪费性能的

删除缓存优点:简单、成本低,容易开发;缺点:会造成⼀次cachemiss

如果更新缓存开销较⼩并且读多写少,基本不会有写并发的时候可以才⽤更新缓存,否则通⽤做法还是删除缓存。

总总结结

⽅⽅案案问问题题问问题题出出现现概概率率

您可能关注的文档

文档评论(0)

8d758 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档