Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
276 views
in Technique[技术] by (71.8m points)

缓存和数据库事务一致性问题

在运用缓存的时候很大的一个问题是与数据库的事务一致性问题,网上也找了些文章看了下,但是基本上谈的是正常服务器运行状态下出现的异常处理,我在思考的是硬件或者容器本身出现异常导致程序运行中断,这种情况下如何处理缓存和数据库一致性问题?可能很多项目里缓存只是作为一个快速读取减轻服务器压力的一个工具,缓存只作为数据库数据的一个备份,缓存有问题到时候过期了数据库再同步也是没问题的。但是我现在的项目中把缓存数据做成了业务数据,这就造成了某些场景下直接用缓存操作业务相关的数据,然后再存入数据库,而另一些场景则是数据库先更新,然后变更缓存,这就要求缓存中的业务数据不能错,而且设计成了永不过期。正常运行的情况下就算有异常也能用手动控制事务来回滚,但是如果是意外情况导致程序崩溃这样就很有可能造成数据库和缓存的不一致,而重启后如何同步这些缓存数据也是头疼的事情,一方面是这种异常到底造成什么数据不一致是不知道的,人工也不可能直接查出来,想要找到有问题的数据并且恢复会很难,但是如果不及时发现并恢复就会造成严重的生产问题,另外一个是缓存是没有有效期的,而且不能把数据库中的数据直接覆盖缓存,因为集群环境下还有其他业务在操作缓存数据。感觉很难有一个完美的解决方案彻底杜绝,主要是把缓存当作了业务处理的数据就有很多麻烦,但是当初这么设计是为了并发减轻数据库压力,不知道有谁有这方面的经验,缓存如果用作业务数据的操作如何能保证数据一致性?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

是不是可以做消息异步更新,先将数据落入队列,再异步更新。 既可以保证数据的最终一致性,也可以做数据恢复使用。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to MLink Developer Q&A Community for programmer and developer-Open, Learning and Share
...