首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

极客时间Go进阶训练营全新升级第5期2022-一息尚存山要看

缓存与数据库双写分歧性几种战略剖析

一、背景

极客时间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中极端场景,此处不赘述

四、总结

关于每种计划战略,各有利害,但分歧性问题一直存在(文章开头扫除了原子性和锁),只是发作的几率在一点点渐渐变小了,计划的评价不只要依据本身系统的业务场景,如读写比、并发量、分歧性容忍度,还要思索系统复杂度,投入产出比等,寻觅最适宜的计划。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230420A005QO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券