前言
本文主要是缓存与数据库的一致性的文章,如果有什么需要改进的地方还请大佬指出⛺️
作者简介:大家好,我是青衿
☁️博客首页:CSDN主页放风讲故事
每日一句:努力一点,优秀一点
目录
文章目录
- 前言
- **目录**
- CAP原则
- 如何使用 CAP 理论?
- 一致性
- Redis一致性策略
- 先更新数据库再删除Redis中的数据的方法,CAP你这种方式还是会出现数据不一致情况
- 先更新数据库再删除Redis中的数据的方法分析:
- 文章末尾
CAP原则
CAP 理论对分布式系统的特性做了高度抽象,形成了三个指标:
● 一致性(Consistency)
● 可用性(Availability)
● 分区容错性(Partition Tolerance)
- 一致性说的是客户端的每次读操作,不管访问哪个节点,要么读到的都是同一份最新的数据,要么读取失败。
- 可以把一致性看作是分布式系统对访问本系统的客户端的一种承诺:不管你访问哪个节点,要么我给你返回的都是绝对一致的数据,要么你都读取失败。因此可以看到,一致性强调的不是数据完整,而是各节点间的数据一致。
可用性(A):- 可用性说的是任何来自客户端的请求,不管访问哪个节点,都能得到响应数据,但不保证是同一份最新数据。
- 可用性看作是分布式系统对访问本系统的客户端的另外一种承诺:我尽力给你返回数据,不会不响应你,但是我不保证每个节点给你的数据都是最新的。 这个指标强调的是服务可用,但不保证数据的一致。 分区容错性(P):
- 当节点间出现任意数量的消息丢失或高延迟的时候,系统仍然可以继续提供服务。
- 也就是说,分布式系统在告诉访问本系统的客户端:不管我的内部出现什么样的数据同步问题,我会一直运行,提供服务。这个指标,强调的是集群对分区故障的容错能力。
如何使用 CAP 理论?
我们都知道,只要有网络交互就一定会有延迟和数据丢失,而这种状况我们必须接受,还必须保证系统不能挂掉。所以就像我上面提到的,节点间的分区故障是必然发生的。也就是说,分区容错性(P)是前提,是必须要保证的。
现在就只剩下一致性(C)和可用性(A)可以选择了:要么选择一致性,保证数据绝对一致;要么选择可用性,保证服务可用。
那么 CP 和 AP 的含义是什么呢?
● 当选择了一致性(C)的时候,如果因为消息丢失、延迟过高发生了网络分区,部分节点无法保证特定信息是最新的,那么这个时候,当集群节点接收到来自客户端的写请求时,因为无法保证所有节点都是最新信息,所以系统将返回写失败错误,也就是说集群拒绝新数据写入。
● 当选择了可用性(A)的时候,系统将始终处理客户端的查询,返回特定信息,如果发生了网络分区,一些节点将无法返回最新的特定信息,它们将返回自己当前的相对新的信息。
一致性
数据库如mysql等磁盘数据库,后端系统中数据最终存储在数据库中
缓存如redis等内存数据库,速度快,在运行时提高系统性能
这两种数据库同时在系统中,就需要两种数据库数据的一致性
缓存与数据库的数据一致性问题:当插入或者更新一条数据,怎么保持数据一致?
可以想到3种策略
先更新数据库,再更新缓存
先删除缓存,再更新数据库
先更新数据库,再删缓存
三个策略都存在缺陷,应该先改数据库,再删缓存,一般会放弃一定的一致性,追求最终一致。
Redis一致性策略
实时同步:缓存或DB修改,另一方同步修改。强一致性要求比较高,可采用实时同步,这就是前面推荐的一致性策略:先更新数据库,再删除缓存
非实时同步:热点文章,频繁操作数据库影响系统性能
先更新数据库再删除Redis中的数据的方法,CAP你这种方式还是会出现数据不一致情况
为什么会出现数据不一致?
更新数据库成功,删除Redis失败:这种情况下,Redis中将保留着旧的数据,导致用户读取到过时的信息。直到Redis中的数据过期或者有其他操作触发数据的更新,这种不一致状态才会被解决。
时间窗口问题:即使数据库更新和Redis删除操作都成功了,但是在这两个操作之间的时间窗口里,如果有其他请求读取了Redis中的旧数据,也会导致短暂的数据不一致。
先更新数据库再删除Redis中的数据的方法分析:
一致性(Consistency):
这种方法在数据库更新与Redis删除之间存在一个短暂的时间窗口,在此期间如果有读取操作,可能会读到旧的数据,导致短暂的一致性问题。
可用性(Availability):
通过保持Redis缓存和数据库之间的数据尽量一致,此方法在大多数情况下确保了高可用性。因为即使在进行数据更新和Redis缓存删除的操作中,系统依然能够处理读取请求,无论是从缓存中读取(尽管可能是旧数据)还是在缓存失效后从数据库中读取新数据。
分区容错性(Partition Tolerance):
此方法在一定程度上体现了对分区容错性的考虑。即便在网络分区导致Redis缓存暂时无法更新或删除时,数据库的更新操作仍然可以独立完成,保证了数据的正确性和服务的部分可用性。但是,这种情况下可能会加剧数据不一致的问题,直到网络分区问题解决并且Redis缓存被正确处理。(可用性可以保证,一致性难以保证)