技能开发 频道

分布式之数据库和缓存双写共同性计划(二)

  【IT168 技能】导言

  该文是对《分布式之数据库和缓存双写共同性计划解析》一文的弥补。博主在该文中,提到了这么一句话

  应该没人问我,为什么没有先更新缓存,再更新数据库这种战略。

  博主其时觉得,这种更新战略比较简略,没必要多做阐明,成果太多人留言给博主,问我为什么不说这套计划?好吧,博主先跟咱们道个歉,是我的问题。所以再开一文,把这个计划阐明一下

  正文

  下面阐明一下先更缓存,再更新数据库这套计划更新数据库失利了怎样办?这个问题其实很好处理,供给一个补偿方法即可。这个补偿方法,咱们灵敏变通,博主仅仅举例,如下图所示:

分布式之数据库和缓存双写共同性计划(二)

  流程如下所示(1)更新缓存数据;

  (2)更新数据库失利

  (3)将需求更新的sql发送至音讯行列

  (4)自己消费音讯,取得需求更新的sql

  (5)持续重试更新操作,直到成功

  其他计划不罗列,由于要点不在这,

  鄙人面的状况有存在其他的线程安全问题么?

  有的,假定这会一起有恳求A和恳求B进行更新操作,那么会呈现

  (1)线程A更新了缓存

  (2)线程B更新了缓存

  (3)线程B更新了数据库

  (4)线程A更新了数据库恳求A更新数据库应该比恳求B更新数据库早才对,但是由于网络等原因,B却比A更早更新了数据库。这就导致了脏数据,因而不考虑。但是,这时分有一个仔细的读者,给博主举了一个反例。该比如出自《从P1到P7——我在淘宝这7年》这篇博客,博主偷个懒,直接贴一下该博客的原话

  在【招财进宝】项目中有一个技能的细节值得拿出来说说,淘宝产品概况页面每天的流量在10亿以上,里边的内容都是放在缓存里的,做【招财进宝】的时分,咱们要给卖家显现他的产品被阅读的次数,这个数字有必要实时更新,而用缓存的话一般都是异步更新的。所以产品表里边增加了这样一个字段,每增加一个PV这个字段就要更新一次。发布上去一个小时数据库就挂掉了,撑不住这么高的update。数据库撑不住怎样办?一般的缓存战略是不支持实时更新的,这时分多隆大神想了个方法,在apache上面写了一个模块,这个数字底子不通过基层的web容器(只通过apache)就写入一个集中式的缓存区了,这个缓存区的数据再异步更新到数据库。如同什么问题,到了多隆手里,总能方便的解决。

  好吧,假如没耐性的读者,直接看博主的总结吧。上面巴拉巴拉一堆,就是说,其时他们有一个读多写多的场景,然后多隆大神用了先更缓存,再异步更新数据库的战略。

  莫非淘宝的大神没发现线程安全问题?不是的,上面提到的场景具有一个特殊性。咱们先摘取要害一句话

  所以产品表里边增加了这样一个字段,每增加一个PV这个字段就要更新一次

  ps:PV是page view,页面阅读量的意思。博主大胆猜想,他们做的应该是用户每次点击,数据库里的这个字段就加一的操作。那咱们这时的SQL一般是这么写

  update product_tb set number = number+1 where product_id =xxx

  咱们留意到了么,并发履行这句SQL并不需求关怀履行次序。哪个更新线程先履行加一的SQL句子 ,与操作次序有什么联络呢?再说的浅显一点,假定咱们一起有恳求A和恳求B进行更新操作,那么会呈现

  (1)线程A更新了缓存

  (2)线程B更新了缓存

  (3)线程B更新了数据库

  (4)线程A更新了数据库由于他们这个时分履行的sql是无序的,所以上面的过程(3)和过程(4)哪一个过程先履行,并没有联络。终究成果一定是共同的。

  容博主烦琐,来个实例,假定表product_tb如下

  product_id       number

    1               3

  这时恳求A和恳求B一起对product_id为1的数据进行更新操作,无论是按呈现并发问题时的次序(1)线程B更新了数据库,进行加一(2)线程A更新了数据库,进行加一仍是正常的次序(1)线程A更新了数据库,进行加一(2)线程B更新了数据库,进行加一终究成果都是

  product_id       number

    1             5

  ok。提到这儿,咱们应该是懂了。换句话说,假如此刻,操作的sql是有序的,就会呈现最上面说的线程安全问题。所以,期望咱们针对问题多考虑总结。给咱们留一个考虑问题?假如此刻是一个读多写多的场景,又要求更新数据库的操作有必要严厉确保次序,那这个时分怎样确保缓存和数据库的共同性?咱们可以来我的博客留言。

  总结

  本文是对前次文章的一次文章的一次弥补。只怪博主考虑问题过分简略,给咱们留了个坑。因而再开一篇文章进行弥补阐明。期望咱们可以有所收成。

0
相关文章