For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
数据一致性问题是程序员在学习java编程开发语言的时候需要经常面对的一个问题了,而本文我们就通过案例分析来简单了解一下,数据一致性概念与实现方法分享。
一、什么是数据一致性?
数据一致性通常讲的主要是数据存储系统,主从mysql、分布式存储系统等,如何保证数据一致性,
比如说主从一致性,副本一致性,保证不同的时间或者相同的请求访问这种主从数据库时访问的数据是一致性的,不会这次访问是结果A下次是结果B。
二、CAP定理
说到数据一致性,就必须说CAP定理。
Consistency:一致性。数据库ACID操作是在一个事务中对数据加以约束,使得执行后仍处于一致状态,而分布式系统在进行更新操作时所有的用户都应该读到新值。
Availability:可用性。每一个操作总是能够在一定时间内返回结果。结果可以是成功或失败,一定时间是给定的时间。
PartitionTolerance:分区容忍性。考虑系统效能和可伸缩性,是否可进行数据分区。
CAP定理认为,一个提供数据服务的存储系统无法同时满足数据一致性、数据可用性、分区容忍性。
为什么?如果采用分区,分布式节点之间就需要进行通信,涉及到通信,就会存在某一时刻这一节点只完成一部分业务操作,在通信完成的这一段时间内,数据就是不一致的。如果要保证一致性,就要在通信完成的这段时间内保护数据,使得对访问这些数据的操作都不可用。
反过来思考,如果想保证一致性和可用性,那么数据就不能够分区。一个简单的理解就是所有的数据就必须存放在一个数据库里面,不能进行数据库拆分。这个对于大数据量、高并发的互联网应用来说,是不可接受的。
三、数据一致性模型
基于CAP定理,一些分布式系统通过复制数据来提高系统的可靠性和容错性,也就是将数据的不同副本存放在不同的机器。常用的一致性模型有:
强一致性:数据更新完成后,任何后续访问将会返回新的数据。这在分布式网络环境几乎不可能实现。
弱一致性:系统不保证数据更新后的访问会得到新的数据。客户端获取新的数据之前需要满足一些特殊条件。
终一致性:是弱一致性的一种特例,保证用户终能够读取到某操作对系统特定数据的更新。
四、如何保证数据一致性?
针对刚开始的问题,如果加以思考,你可能会发现不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。
(1)先删除缓存
1、如果先删除Redis缓存数据,然而还没有来得及写入MySQL,另一个线程就来读取;
2、这个时候发现缓存为空,则去Mysql数据库中读取旧数据写入缓存,此时缓存中为脏数据;
3、然后数据库更新后发现Redis和Mysql出现了数据不一致的问题。
(2)后删除缓存
1、如果先写了库,然后再删除缓存,不幸的写库的线程挂了,导致了缓存没有删除;
2、这个时候就会直接读取旧缓存,终也导致了数据不一致情况;
3、因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。
解决方案1:分布式锁
在平时开发中,利用分布式锁可能算是比较常见的解决方案了。利用分布式锁把缓存操作和数据库操作封装为逻辑上的一个操作可以保证数据的一致性,具体流程为:
1、每个想要操作缓存和数据库的线程都必须先申请分布式锁;
2、如果成功获得锁,则进行数据库和缓存操作,操作完毕释放锁;
3、如果没有获得锁,根据不同业务可以选择阻塞等待或者轮训,或者直接返回的策略。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。