缓存失败了怎么办?
创始人
2025-06-01 13:50:59
0

删缓存失败怎么办?

如果缓存删除失败了,也会导致缓存和数据库的数据不一致。

所以为了解决这个方案,我们加入一个重试机制。

在接口中如果更新了数据库成功了,但更新缓存失败了,可以立刻重试3次。如果其中有任何一次成功,则直接返回成功。如果3次都失败了,则写入数据库,准备后续再处理。

当然,如果你在接口中直接同步重试,该接口并发量比较高的时候,可能有点影响接口性能,这个我们不怕,可以改为异步。

异步重试方式有很多种:

1.每次都单独起一个线程,该线程专门做重试的工作。但如果在高并发的场景下,可能会创建太多的线程,导致系统OOM问题,不太建议使用。

2.将重试的任务交给线程池处理,但如果服务器重启,部分数据可能会丢失。

3.将重试数据写表,然后使用elastic-job等定时任务进行重试。

4.将重试的请求写入mq等消息中间件中,在mq的consumer中处理。

5.订阅mysql的binlog,在订阅者中,如果发现了更新数据请求,则删除相应的缓存。

定时任务

我们创建一个重试表,表中有个字段记录重试次数,初始值为0,同时设置一个最大的重试次数,用一个定时任务异步的去读取重试表中的数据,然后去执行删除缓存操作,每删除一次,重试次数加1,如果其中有任意一次成功了,则返回成功。如果重试了5次,还是失败,则我们需要在重试表中记录一个失败的状态,等待后续进一步处理。

在高并发场景中,定时任务推荐使用elastic-job。相对于xxl-job等定时任务,它可以分片处理,提升处理速度。同时每片的间隔可以设置成:1,2,3,5,7秒等。

使用定时任务重试的话,有个缺点就是实时性没那么高,对于实时性要求特别高的业务场景,该方案不太适用。但是对于一般场景,还是可以用一用的。

但它有一个很大的优点,即数据是落库的,不会丢数据。

MQ

在高并发的业务场景中,mq(消息队列)是必不可少的技术之一。它不仅可以异步解耦,还能削峰填谷。对保证系统的稳定性是非常有意义的。

mq的生产者,生产了消息之后,通过指定的topic发送到mq服务器。然后mq的消费者,订阅该topic的消息,读取消息数据之后,做业务逻辑处理。

使用mq重试的具体方案如下:

当用户操作写完数据库,但删除缓存失败了,产生一条mq消息,发送给mq服务器。

mq消费者读取mq消息,重试5次删除缓存。如果其中有任意一次成功了,则返回成功。如果重试了5次,还是失败,则写入死信队列中。

当然在该方案中,删除缓存可以完全走异步。即用户的写操作,在写完数据库之后,不用立刻删除一次缓存。而直接发送mq消息,到mq服务器,然后有mq消费者全权负责删除缓存的任务。

因为mq的实时性还是比较高的,因此改良后的方案也是一种不错的选择。

binlog

前面两种删除的重试方案 都有一定的侵入性:

在使用定时任务的方案中,需要在业务代码中增加额外逻辑,如果删除缓存失败,需要将数据写入重试表。

使用mq的方案中,如果删除缓存失败了,需要在业务代码中发送mq消息到mq服务器。

其实,还有一种更优雅的实现,即监听binlog,比如使用:canal等中间件。

具体方案如下:

在业务接口中写数据库之后,就不管了,直接返回成功。

mysql服务器会自动把变更的数据写入binlog中。

binlog订阅者获取变更的数据,然后删除缓存。

这套方案中业务接口确实简化了一些流程,只用关心数据库操作即可,而在binlog订阅者中做缓存删除工作。

但是呢,这种方案还会出现删除失败的情况,因为基于binlog实现的删除只会删除一次,所以我们最终还是需要依赖于基于定时任务或者mq的重试机制。

在binlog订阅者中如果删除缓存失败,则发送一条mq消息到mq服务器,在mq消费者中自动重试5次。如果有任意一次成功,则直接返回成功。如果重试5次后还是失败,则该消息自动被放入死信队列,后面可能需要人工介入。

相关内容

热门资讯

2025西普会BD项目|一款美... 转自:新康界(转自:新康界)
浙江:依托省级医院培养 建强大... 对大学生乡村医生在职称晋升上给予政策倾斜。对于在基层医疗卫生机构工作的,中级职称考试通过的可直接聘任...
Switch 2明日正式发售,... 6月5日,任天堂新一代主机Switch 2将迎来全球发售,发售价3889元(叠加税金到手价为4242...
白天不闷晚上凉快,北京这种“干... 新京报讯(记者王景曦)“北京漫画版天空太美了!”连日来,北京的天空湛蓝、白云朵朵,像极了漫画。有市民...
爱旭股份(600732.SH)... 格隆汇6月4日丨爱旭股份(600732.SH)公布,公司拟与临邑县人民政府签署《临邑县中部风电项目资...
民银资本(01141.HK)购... 格隆汇6月4日丨民银资本(01141.HK)公告,于2025年6月4日,公司全资附属公司民银投资(香...
安徽师大通报“因猥亵被处分男教... 6月4日,安徽师范大学发布情况通报称,针对2025年6月3日晚网上反映我校“因猥亵被处分的男教师又到...
甘肃省新能源发电出力占比首次突... 转自:中国电力新闻网  原标题:甘肃新能源发电出力占比首次突破80%  记者从国网甘肃省电力公司获悉...
(乡村行·看振兴)一颗杨梅的“... 中新网杭州6月4日电(郭其钰)时值杨梅丰收季,走进浙江省杭州市桐庐县梅蓉村甜蜜工坊,工人们将浸泡一年...
南向资金追踪|净流入约35亿港... 财联社6月4日讯(编辑 冯轶)据Wind数据显示,南向资金今日成交约1063.30亿港元,约为恒指今...
财报横评丨“蔚小理零”一季报出... 每经记者|孙磊    每经实习编辑|余婷婷     6月3日晚,随着蔚来公布今年一...
青海油田老油区挖潜“稳底盘” 转自:中国电力新闻网  今年截至目前,青海油田原油老区自然递减率同比下降2.32个百分点,综合递减率...
爱是流动的!大爷给帮过自己的姑... 转自:千龙网 #姑娘1次指路让2家人成了亲人#【爱是流动...
亚朵现医院枕套与品牌形象不符 ... 【#亚朵现医院枕套与品牌形象不符# 如何让住客踏踏实实睡个好觉?】#亚朵枕套漏洞何以引起如此关注# ...
天津南1000千伏特高压变电站... 中新网天津6月4日电(记者 周亚强)记者从国网天津电力公司获悉,天津南1000千伏特高压变电站扩建工...
常州组织开展大学校园一站式社区... 转自:扬子晚报近日,常州市见义勇为基金会联合常州市公安局巡特警支队见义勇为工作站到江苏理工学院管理学...
6月4日沪深两市强势个股与概念... 一、强势个股截至6月4日收盘,上证综指上涨0.42%,收于3376.2点,深证成指上涨0.87%,收...
永安期货(600927.SH)... 永安期货(600927.SH)公告,公司拟以集中竞价交易方式回购公司股份用于减少注册资本。回购股份金...
安徽师范大学通报“因猥亵被处分... 6月4日,安徽师范大学发布情况通报: 针对2025年6月3日晚网上反映我校“因猥亵被处分的男教师又到...
大为股份:深圳市大为弘德汽车工... 证券日报网讯大为股份6月4日在互动平台回答投资者提问时表示,深圳市大为弘德汽车工业有限公司(以下简称...