
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
缓存技术是大多数Java编程开发程序员和其他软件开发程序员在开发软件过程中都会用到的一个编程技术,而本文我们就通过案例分析来简单了解一下,缓存的数据一致性问题都有哪些。
缓存的数据一致性
缓存作为持久化存储(如数据库)的辅助存在,毕竟属于两套系统。理想情况下是缓存数据与数据库中数据完全一致,但是业务常使用的旁路缓存架构下,在一些分布式或者高并发的场景中,可能会出现缓存不一致的情况。
数据库更新+缓存更新
在数据有变更的时候,需要同时更新缓存和数据库两个地方的数据。因为涉及到两个模块的数据更新,所以会有2种组合情况:
先更新缓存,再更新数据库
先更新数据库,再更新缓存
在单线程场景下,如果更新缓存和更新数据库操作都是成功的,则可以保证数据库与缓存数据是一致的。但是在多线程场景下,由于由于更新缓存和更新数据库是两个操作,不具备原子性,就有可能出现多个并发请求交叉的情况,进而导致缓存和数据库中的记录不一致的情况。
数据库更新+缓存删除
在旁路型缓存的读操作分支中,从缓存中没有读取到数据而改为从DB中获取到数据之后,通常都会选择将记录写入到缓存中。所以我们也可以在写操作的时候选择将缓存直接删除,等待后续读取的时候重新加载到缓存中。
这样也会有两种组合情况:
先删除缓存,再更新数据库
先更新数据库,再删除缓存
这种也会出现前面说的先操作成功,后操作失败的问题。
我们先看下先删除缓存再更新数据库的操作策略。如果先删除缓存成功,然后更新数据库失败,这种情况下,再次读取的时候,会从DB里面将旧数据重新加载回缓存中,数据是可以保持一致的。
虽然更新数据库失败这种场景下不会出现问题,但是在数据库更新成功这种正常情况下,却可能会在并发场景中出现问题。因为常见的缓存(如Redis)是没有事务的,所以可能会因为并发处理顺序的问题导致终数据不一致。
当然,因为基于数据库事务机制来控制,需要注意下事务的粒度不能过大,避免事务成为阻塞系统性能的瓶颈。在对并发性能要求极高的情况下,可以考虑非事物类的其余方式来实现,如重试机制、或异步补偿机制、或多者结合方式等。
缓存如果删除失败,则按照预定的重试策略(比如对于指定错误码进行重试,多重试3次,每次重试间隔100ms等)进行重试。
如果缓存删除失败,且重试依旧失败,则将此删除事件放入到MQ中。
独立的补偿逻辑,会去消费MQ中的消息事件请求,然后按照补偿策略继续尝试删除。
每个缓存记录设定过期事件,极端情况下,重试删除、补偿删除等策略全部失败时,等到数据记录过期自动从缓存中淘汰,作为兜底策略。
这种处理方式,虽然依旧无法百分百保证数据一致,但是整体出现数据不一致情况的概率与可能性非常的小。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。