缓存并发更新顺序的问题

来源:11-5 缓存-高并发场景问题讲解

zhusx

2018-08-30

之前面试,有被问到,缓存更新的顺序是什么,先更新数据库,还是先删除缓存。

老师能具体讲一下吗。

写回答

1回答

Jimin

2018-08-30

你好,这个问题,很难找到一种方案能适用于所有的场景,否则早就会一些组件封装出来使用了,而且数据一致性也是所有分布式系统都很难从根本解决的问题,cap原理就放在那,谁都躲不开。

但实际这个问题确实存在,面试也会问到,其实关键还是考察你是否能根据不同的场景做特定的分析,也看看是否你能给出一些可行的方案。这里说一些手段,你可以感受一下:

1、更新数据库,异步更新缓存,如果失败,可以选择放入消息队列去更新或删除掉

2、先更新缓存,如果失败,可以选择放入消息队列去更新或删除掉,再更新数据库。如果数据库更新失败,删除缓存(依旧可以通过多种手段保证删除成功)

这两点都是通过异步或消息队列的方式保证数据最终一致性,但是需要注意的是,先删除缓存出错时,不能影响主流程数据库更新的操作,本质上缓存是否更新失败都要保证数据库更新进行操作。因此呢,我个人更喜欢先更新数据库,然后借助消息队列等保证缓存里数据和db里的一致,甚至删除缓存保证数据正确。

3、可以在缓存中考虑加入标记位,先更新缓存时,可以先置标记位为失效状态,等db更新后,再更新缓存数据,并更新标记位为有效。当使用缓存时,记得check标记位就可以了。

实际中出现这种问题的概率很小,毕竟那些缓存的组件,比如redis,性能都特别好,因此在实际中,我们都默认按照他会成功去处理,然后捕捉住异常,做些补偿性手段,来保证最终的一致性。其实,也没有什么完美的方案,适合自己的场景,代价最小的,就是最好的~


1
2
Jimin
回复
zhusx
嗯,理论上淘汰更保险一点。但是,很多时候还是希望缓存能有,挡住请求打到数据库。淘汰缓存也容易一些
2018-08-31
共2条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程