缓存与数据库双写分歧性几种战略剖析
一、背景
极客时间Go进阶训练营全新升级第5期2022
download:https://www.zxit666.com/5267/
在高并发场景中,为避免大量恳求直接访问数据库,缓解数据库压力,常用的方式普通会增加缓存层起到缓冲作用,减少数据库压力。引入缓存,就会触及到缓存与数据库中数据如何坚持分歧性问题,本文将对几种缓存与数据库保证数据分歧性的运用方式停止剖析。为保证高并发性能,以下剖析场景不思索执行的原子性及加锁等强分歧性请求的场景,仅追求最终分歧性。
二、读取过程
• 读缓存
• 假如缓存里没有值,那就读取数据库的值
• 同时把这个值写进缓存中
三、更新过程
更新操作有多种战略,各有优劣,主要针对此场景停止剖析
战略1:先更新db,再删除缓存(常用的Cache-Aside Pattern旁路缓存)
问题:
1.假如更新db胜利,删缓存失败,将招致数据不分歧
2.极端场景,恳求A读,B写
1)此时缓存刚好失效 2)A查库得到旧值 3)B更新DB胜利
4)B删除缓存 5)A将查到的旧值更新到缓存中
此场景的发作需求步骤2)查db 一直慢于 3)的更新db,才干招致4)先于5)执行,通常db的查询是要快于写入的,所以此极端场景的产生过于严厉,不易发作
战略2:先更新db,再更新
问题:
1.并发更新场景下,更新缓存会招致数据不分歧
2.依据读写比,思索能否有必要频繁同步更新缓存,而且,假如结构缓存中数据过于复杂,或者数据更新频繁,但是读取并不频繁的状况,还会形成不用要的性能损耗
此种方式不引荐
战略3:先更新缓存,再更新db
同上,不引荐
战略4:先删缓存,再更新db
先删缓存,固然处理了战略1中,后删缓存假如失败的场景,但也会发作不分歧的问题
例如:恳求 A 删除缓存,这时恳求B来查,就会击穿到数据库,B读取到旧的值后写入缓存,A正常更新db,由于时间差招致数据不分歧的状况
战略5:缓存延时双删
该战略兼容了战略1和战略4,处理了先删缓存还是后删缓存的问题,如战略1中,更新db后删缓存失败和战略4中的不分歧场景,该战略能够将延时时间内(比方延时10ms)所形成的缓存脏数据,再次删除。但是,假如延时删缓存失败,战略4中不分歧问题还会发作,同时延时的完成,如创立线程,或者引入mq异步,可能会增加系统复杂度问题。
战略6:变种双删,前置缓存过时时间
该战略针对战略1中后删缓存失败的场景,前置一层缓存数据过时时间(详细时间依据本身系统自身评价,如可掩盖db读写耗时或分歧性容忍度等),更新db后就算删缓存失败,在expire时间后也能保证缓存中无数据。同时,前置expire失败,或者更新db失败,都不会影响数据分歧。
可以处理战略4中的问题:恳求 A 删除缓存,这时恳求B来查,就会击穿到数据库,B读取到旧的值后写入缓存,A正常更新db,由于时间差招致数据不分歧的状况,描绘图如下:
本战略中步骤1为expire缓存,不会发作击穿缓存到数据库的状况,数据将直接返回。除非更极端状况,如下图:
expire时间没有掩盖住更新db的耗时,相似战略1中极端场景,此处不赘述
四、总结
关于每种计划战略,各有利害,但分歧性问题一直存在(文章开头扫除了原子性和锁),只是发作的几率在一点点渐渐变小了,计划的评价不只要依据本身系统的业务场景,如读写比、并发量、分歧性容忍度,还要思索系统复杂度,投入产出比等,寻觅最适宜的计划。
领取专属 10元无门槛券
私享最新 技术干货