课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据库开发是程序员在学习后端编程开发的时候需要重点掌握的编程知识之一,而今天我们就一起来了解一下,数据库更新中缓存与数据的一致性优化方法。
一、写请求串行化
写请求
1.写请求更新之前先获取分布式锁,获得之后才能去数据库更新这个数据,获取不到就进行等待,超时后就返回更新失败。
2.更新完之后去刷新缓存,如果刷新失败,放到内存队列中进行重试(重试时取数据库新数据更新缓存)。
读请求
读请求发现缓存中没有数据时,直接去读取数据库,读完更新缓存。
总结
这种技术方案通过对写请求的实现串行化来保证数据一致性,但是会导致吞吐量变低。比较适合银行相关的业务,因为对于银行项目来说,保证数据一致性比可用性更加重要,就像是去存款机存钱,取钱时,为了保证账户安全,都是会让用户执行操作后,等待一段时间才能获得反馈,这段时间其实取款机是不可用的。
二、先更新数据库,异步删除缓存,删除失败后重试
1.先更新数据库
2.异步删除缓存(如果数据库是读写分离的,那么删除缓存时需要延迟删除,否则可能会在删除缓存时,从库还没有收到更新后的数据,其他读请求就去从库读到旧数据然后设置到缓存中。)
3.删除缓存失败时,将删除的key放到内存队列或者是消息队列中进行异步重试
####发散思考
>在更新完数据库后,我们为什么不直接更新,而是采用删除缓存呢?
这是因为直接更新缓存的话,在高并发场景下,有多个更新请求时,难以保证后更新数据库的请求会后更新缓存,也就是上面的高并发写问题。如果采用删除缓存,可以让下次读时读取数据库,更新缓存,保证一致性。
三、业务项目更新数据库,其他项目订阅binlog更新
1.业务项目直接更新数据库。
2.cannal项目会读取数据库的binlog,然后解析后发消息到kafka。
3.然后缓存更新项目订阅topic,从kafka接收到更新数据库操作的消息后,更新缓存,更新缓存失败时,新建异步线程去重试或者将操作发到消息队列,后续再进行处理。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。