武汉 [切换城市]

武汉站

缓存更新的套路是怎样的?

更新时间:2019/4/11 14:15:58信息编号:1039-2046030
所属分类:
教育培训 电脑培训 
所在区域:
武汉 洪山
详细地址:
虎泉地铁站A、B出口旁
联 系 人:
舒老师
电  话:
13260580922
联系QQ:
联系QQ 2860419565
收录查询: 百度 搜狗 360   分享更易传播
赶驴网提醒您:1、在办理服务前请确认对方资质, 夸大的宣传和承诺不要轻信!2.任何要求预付定金、汇款至个人银行账户等方式均存在风险,谨防上当受骗!
详细介绍
看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中欢迎www.ganlv5.com。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。
我不知道为什么这么多人用的都是这个逻辑,当我在微博上发了这个贴以后,我发现好些人给了好多非常复杂和诡异的方案,所以,我想写这篇文章说一下几个缓存更新的Design Pattern(让我们多一些套路吧)。
这里,我们先不讨论更新缓存和更新数据这两个事是一个事务的事,或是会有失败的可能,我们先假设更新数据库和更新缓存都可以成功的情况(我们先把成功的代码逻辑先写对)。
更新缓存的的Design Pattern有四种:Cache aside, Read through, Write through, Write behind caching,我们下面一一来看一下这四种Pattern。
Cache Aside Pattern
这是最常用最常用的pattern了。其具体逻辑如下:
失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中g_a_n_l_v_5_c_o_m
命中:应用程序从cache中取数据,取到后返回。
更新:先把数据存到数据库中,成功后,再让缓存失效。 
注意,我们的更新是先更新数据库,成功后,让缓存失效。那么,这种方式是否可以没有文章前面提到过的那个问题呢?我们可以脑补一下。
一个是查询操作,一个是更新操作的并发,首先,没有了删除cache数据的操作了,而是先更新了数据库中的数据,此时,缓存依然有效,所以,并发的查询操作拿的是没有更新的数据,但是,更新操作马上让缓存的失效了,后续的查询操作再把数据从数据库中拉出来。而不会像文章开头的那个逻辑产生的问题,后续的查询操作一直都在取老的数据。
这是标准的design pattern,包括Facebook的论文《Scaling Memcache at Facebook》也使用了这个策略。为什么不是写完数据库后更新缓存?你可以看一下Quora上的这个问答《Why does Facebook use delete to remove the key-value pair in Memcached instead of updating the Memcached during write request to the backend?》,主要是怕两个并发的写操作导致脏数据g+a+n+l+v+5+c+o+m
那么,是不是Cache Aside这个就不会有并发问题了?不是的,比如,一个是读操作,但是没有命中缓存,然后就到数据库中取数据,此时来了一个写操作,写完数据库后,让缓存失效,然后,之前的那个读操作再把老的数据放进去,所以,会造成脏数据。
但,这个case理论上会出现,不过,实际上出现的概率可能非常低,因为这个条件需要发生在读缓存时缓存失效,而且并发着有一个写操作。而实际上数据库的写操作会比读操作慢得多,而且还要锁表,而读操作必需在写操作前进入数据库操作,而又要晚于写操作更新缓存,所有的这些条件都具备的概率基本并不大。
所以,这也就是Quora上的那个答案里说的,要么通过2PC或是Paxos协议保证一致性,要么就是拼命的降低并发时脏数据的概率,而Facebook使用了这个降低概率的玩法,因为2PC太慢,而Paxos太复杂。当然,最好还是为缓存设置上过期时间。
Read/Write Through Pattern
我们可以看到,在上面的Cache Aside套路中,我们的应用代码需要维护两个数据存储,一个是缓存(Cache),一个是数据库(Repository)。所以,应用程序比较啰嗦。而Read/Write Through套路是把更新数据库(Repository)的操作由缓存自己代理了,所以,对于应用层来说,就简单很多了来自www.ganlv5.com。可以理解为,应用认为后端就是一个单一的存储,而存储自己维护自己的Cache。
Read Through
Read Through 套路就是在查询操作中更新缓存,也就是说,当缓存失效的时候(过期或LRU换出),Cache Aside是由调用方负责把数据加载入缓存,而Read Through则用缓存服务自己来加载,从而对应用方是透明的。
Write Through
Write Through 套路和Read Through相仿,不过是在更新数据时发生。当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后再由Cache自己更新数据库(这是一个同步操作)
下图自来Wikipedia的Cache词条。其中的Memory你可以理解为就是我们例子里的数据库。
write Behind Caching Pattern
Write Behind 又叫 Write Back。一些了解Linux操作系统内核的同学对write back应该非常熟悉,这不就是Linux文件系统的Page Cache的算法吗?是的,你看基础这玩意全都是相通的g_a_n_l_v_5_c_o_m。所以,基础很重要,我已经不是一次说过基础很重要这事了。
Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。这个设计的好处就是让数据的I/O操作飞快无比(因为直接操作内存嘛 ),因为异步,write backg还可以合并对同一个数据的多次操作,所以性能的提高是相当可观的。
但是,其带来的问题是,数据不是强一致性的,而且可能会丢失(我们知道Unix/Linux非正常关机会导致数据丢失,就是因为这个事)。在软件设计上,我们基本上不可能做出一个没有缺陷的设计,就像算法设计中的时间换空间,空间换时间一个道理,有时候,强一致性和高性能,高可用和高性性是有冲突的。软件设计从来都是取舍Trade-Off。
另外,Write Back实现逻辑比较复杂,因为他需要track有哪数据是被更新了的,需要刷到持久层上。操作系统的write back会在仅当这个cache需要失效的时候,才会被真正持久起来,比如,内存不够了,或是进程退出了等情况,这又叫lazy writeg a n l v 5 c o m


温馨提示:缓存更新的套路是怎样的?”由用户自行发布,信息内容的真实性、准确性和合法性由发布人负责。虽然部分网友认证了账号,但是并不代表没有风险。赶驴网不提供任何保证不参与交易,亦不承担任何法律责任。
武汉电脑培训全部地区
江汉电脑培训江岸电脑培训硚口电脑培训武昌电脑培训洪山电脑培训青山电脑培训汉阳电脑培训沌口开发区电脑培训东西湖电脑培训蔡甸电脑培训黄陂电脑培训新洲电脑培训江夏电脑培训汉南电脑培训
武汉电脑培训热门城市
北京电脑培训上海电脑培训深圳电脑培训广州电脑培训成都电脑培训天津电脑培训苏州电脑培训杭州电脑培训武汉电脑培训郑州电脑培训南京电脑培训济南电脑培训青岛电脑培训重庆电脑培训西安电脑培训宁波电脑培训石家庄电脑培训沈阳电脑培训厦门电脑培训长沙电脑培训
武汉电脑培训周边城市
武汉电脑培训黄石电脑培训襄阳电脑培训十堰电脑培训荆州电脑培训宜昌电脑培训荆门电脑培训鄂州电脑培训仙桃电脑培训潜江电脑培训孝感电脑培训黄冈电脑培训咸宁电脑培训随州电脑培训恩施电脑培训天门电脑培训神农架电脑培训
武汉电脑培训周边服务
武汉其他培训武汉职业培训武汉电脑培训武汉家教武汉设计培训武汉外语培训武汉企业管理/MBA武汉中小学教育武汉学历教育武汉移民武汉婴幼儿教育武汉留学武汉文体培训
全国电脑培训最新信息
临沂影视策划制作培训,PR,AE后期,游戏动漫设计培训宿州软件测试培训 自动化测试 Java编程 数据库培训班新余IT编程Java培训 前端开发 软件测试 嵌入式开发培训宿迁新媒体运营培训 互联网营销 SEO 短视频运营培训班娄底Java开发培训 软件开发培训 python培训廊坊三河电商拼多多运营培训正规平台重庆少儿编程培训班 Python编程 Scratch培训重庆java培训,前端培训,大数据网络安全运维培训北海影视后期制作培训 短视频剪辑包装 Nuke合成培训班恩施新媒体运营培训班 短视频制作运营 网络营销SEO培训