dot Redis 8 来了——而且它是开源的

了解更多

数据库一致性解释

什么是数据库一致性?

数据库一致性由一组值定义,数据库系统内的所有数据点都必须符合这些值才能被正确读取和接受。如果任何不符合预设值的数据进入数据库,将导致数据集出现一致性错误。通过建立规则来实现数据库一致性。任何写入数据库的数据事务都必须仅根据数据库开发人员设置的规则所建立的特定约束、触发器、变量、级联等更改受影响的数据。

例如,假设您在美国国家交通安全研究所 (NTSI) 工作。您的任务是创建一份新的加州驾驶执照数据库。加州人口在过去十年中激增,因此需要为所有首次获得驾驶执照的人员制定新的字母和数字格式。您的团队确定,数据库中加州驾驶执照的新设值格式如下:1 个字母 + 7 个数字。现在,每个条目都必须遵循此规则。一个读作“C08846024”的条目将返回错误。为什么?因为输入的值是 1 个字母 + 8 个数字,这本质上是一种不一致数据。

一致性还意味着,对一个表中任何特定对象进行的任何数据更改,都需要在存在该对象的所有其他表中进行更改。继续以驾驶执照为例,如果新驾驶员的家庭住址发生变化,则必须在所有存在先前地址的表中体现该更新。如果一个表包含旧地址而所有其他表包含新地址,那就是数据不一致的典型示例。


注意:数据库一致性并不能保证在任何给定事务中引入的数据是正确的。它仅保证在系统中写入和读取的数据符合可以输入数据库的所有数据先决条件。简单来说,根据上面的示例,您完全可以输入符合“1 个字母 + 7 个数字”规则的数据事务,但这并不能保证该数据对应的是实际的驾驶执照。数据库一致性不考虑数据代表什么,只考虑其格式。

为什么数据库一致性很重要?

一致的数据使数据库像一台运转良好的机器一样工作。将不一致的数据排除在主数据库和副本之外的既定规则/值使其操作保持顺畅,并带来

  • 准确性
  • 增加数据库空间
  • 更快、更高效的数据检索

数据库一致性规范所有输入数据。因此,尽管数据库在接受新数据时会发生变化,但它至少会按照最初建立的验证规则一致地变化。在当今世界,全球每天都会基于数据库的感知一致性做出价值数十亿美元的决策。当实时信息成为现代数字企业的新常态时,建立验证规则以确保数据集没有错误信息至关重要,因为错误信息也会增加延迟,从而使实时体验不再那么实时。

数据库一致性示例

现实世界中数据库一致性操作的示例有哪些?我们已经在上面的 NTSI 场景中探讨了一个示例。现在让我们转向银行业。

假设您正在从一个账户向另一个账户转账。您刚刚向一个已有 300 美元的账户转入 1200 美元。您刷新后,确信会看到 1500 美元的余额。然而,您的余额并未反映此最新操作。事实上,您的新余额现在显示为 0 美元。这种技术上的小问题就是弱一致性的典型示例,很可能导致您花费时间与银行代表一起排除故障。此类问题会损害品牌声誉并造成巨额损失。数据库系统中的强一致性对于开发人员和消费者来说正变得越来越重要且不可或缺。

强一致性 vs 弱一致性

强一致性意味着主库、副本及其所有对应节点中的所有数据都符合验证规则,并且在任何给定时间都是相同的。对于强数据库一致性,无论哪个客户端访问数据,他们都将始终看到遵循为数据库建立的规则的最新更新数据。

弱一致性有点像谚语中的蛮荒西部。无法保证您的主库、副本或节点中的数据在任何给定时刻都是相同的。印度的一个客户端访问数据时可能会看到通过验证规则的信息,但可能不是最新的数据,从而导致一致性错误。他们很可能正在根据不再相关的信息进行操作,即使这些信息在某个时候可能是相关的。

https://www.youtube.com/embed/mCOX-2ez-m4

一致性级别

一致性级别是另一组预设值,它们决定了需要有多少个副本或节点返回新的允许数据后,该数据才被确认为有效事务。此操作可以按事务更改。因此,例如,程序员可以指定仅需两个节点读取新输入的数据后,才确认数据一致性。一旦达到该标准,该数据此后将被视为一致数据。

隔离级别

隔离级别是数据库 ACID(原子性、一致性、隔离性、持久性)属性的一部分。ACID 是 SQL 数据库一致性的基础概念,某些数据库遵循它来优化数据库一致性。隔离性是 ACID 的一个属性,它将特定数据片段与数据库网络中的所有信息隔离开,防止其被其他用户事务修改。隔离性用于限制并发事务中产生的无关数据的读写。

隔离级别有四种类型

  • 读未提交 (Read Uncommitted):最低级别。如果前一个事务对该行提供了未提交的更新,则停止该行的更新。
  • 读已提交 (Read Committed):这不允许“脏读”。如果事务已更新但尚未提交,则会阻止任何读取或写入。
  • 可重复读 (Repeatable Read):此级别阻止正在读取的数据行被访问和潜在更新。
  • 可串行化 (Serializable):最高隔离级别,可串行化通常锁定整个表而不是特定的数据行。

数据库一致性常见问题

数据一致性意味着什么?

如果数据在同一时间在所有对应节点中显示相同,则数据是一致的,无论用户是谁以及他们在哪个地理位置访问数据。

数据一致性与数据库一致性是一回事吗?

不是。数据库一致性要求数据在进入网络时遵循验证规则,以便在格式上与表中所有其他数据保持一致。

数据一致性是将数据在整个网络和利用该数据的众多应用程序之间尽可能保持统一的过程。

什么是最终一致性?

对于最终一致性,已更新的数据最终将反映在存储该数据的所有节点中。最终,通过最终一致性,无论哪个客户端在网络中访问数据,所有节点都将生成相同的数据。

关系数据库中的单个表包含什么?

关系数据库中的所有数据都存储在表中,表由行和列组成。数据点按行和列组织。行通常被称为“记录”,通常代表数据的类别,而列或“字段”则代表“实例”。表存在于数据库中,其基于主题的设计有助于防止数据冗余。

关系数据库由什么集合组成?

ACID 模型与 BASE 模型如何比较?

ACID 和 BASE(基本可用、软状态、最终一致)模型的主要区别在于,ACID 致力于优化数据库一致性,而 BASE 则增强高可用性。ACID 保持事务一致,因此如果您选择 BASE 模型,请确保一致性仍然是首要任务并得到彻底解决。

Redis 数据库是一致的吗?

当 Redis 用作缓存时,所说的一致性可能是指 Redis 实例之间(主/副本)以及 Redis 缓存和 Redis 作为主数据库之间的一致性。在这种情况下,如果两者之间的数据不匹配,数据就会不一致。我们的博客《维护缓存一致性的三种方法》讨论了如何解决此问题。

对于开源 Redis,存在弱一致性,但 Redis Enterprise 的 ActiveActive 地理分布式提供了强大的最终一致性。


对企业级应用程序的云缓存技术感兴趣?点击下方阅读 Lee Atchison 的 Caching at Scale with Redis