LRU 缓存如何符合 CAP 定理?

How does an LRU cache fit into the CAP theorem?

今天一直在思考这个问题。 Web 应用程序中数据库上下文中的 LRU 缓存有助于确保 A 可用性以及不依赖于持续访问数据库的快速数据查找。

然而,LRU 缓存在实践中如何保持新鲜?据我了解,一个人不能保证C一致性和A可用性。因此不会从 LRU 缓存中过期的经常使用的项目如何处理修改?这是一个在需要 C 而不是 A 的系统中,LRU 缓存不是一个好的选择的例子吗?

首先,缓存太小而无法容纳所有数据(可能会发生逐出并且 LRU 部分是相关的)不是 CAP 定理的好例子,因为即使不考虑一致性,它也可以甚至可以同时提供分区容错性和可用性。如果客户端请求的数据不在缓存中,网络分区导致缓存无法及时从主库获取数据,那么根本无法及时给客户端任何答复。

如果我们只讨论实际在缓存中的数据,我们可能会有点笨拙地将 CAP 定理仅应用于该数据。然后这取决于该缓存的使用方式。

很多缓存发生在同样拥有权威数据的同一台机器上。例如,您的数据库管理系统(比如 PostgreSql 或其他)可能会在 RAM 中缓存大量数据并从那里而不是从磁盘上的持久数据中回答查询。即使这样 cache invalidation 也是一个毛茸茸的问题。基本上,即使没有网络,您有时也可以使用过时的信息(基本上牺牲一致性),或者缓存系统需要了解数据更改并据此采取行动,这可能会变得非常复杂。不过,CAP 定理根本不适用,因为没有分布。或者,如果您想非常迂腐地看待它(不是通常的表达方式),一台计算机的各个部分用来通信的总线不是 partition tolerant(第三条腿CAP 定理)。更简单地说:如果计算机的各个部分无法相互通信,计算机就会崩溃。

所以 CAP-wise 有趣的情况是主数据库和缓存位于不同的机器上,通过不可靠的网络连接。在这种情况下,有两种基本可能性:(1) 缓存服务器可能会在不询问主数据库其数据是否仍然有效的情况下回答请求,或者 (2) 它可能会在每次请求时检查主数据库。 (1) 意味着牺牲了一致性。如果是 (2),缓存的设计必须处理一个问题:如果缓存没有及时得到主数据库的响应(因为分区,这是一些网络问题),缓存应该告诉客户端什么?在那种情况下,基本上只有两种可能性:它可能仍然使用缓存的数据进行响应,冒着它可能已经失效的风险。这是牺牲一致性。或者它可能会告诉客户它现在无法回答。那就是牺牲可用性。

综上所述

  • 如果一切都发生在一台机器上,则 CAP 定理不适用
  • 如果数据和缓存通过不可靠的网络连接,那不是 CAP 定理的一个很好的例子,因为即使没有 C,你甚至得不到 A&P。
  • 不过,CAP 定理意味着您将不得不牺牲 C 甚至更多的 A&P,而不是缓存最初无法提供的部分。
  • 你最终牺牲了什么取决于缓存的使用方式。