我今天正在思考这个问题。 Web应用程序中数据库上下文中的LRU缓存有助于确保 A 的可用性,该查询具有不依赖于持续访问数据库的快速数据查找。
但是,实际上LRU缓存如何保持最新状态?据我了解,人们无法保证 C 与 A 的可用性。因此,不会从LRU缓存中过期的经常使用的项目如何处理修改?这是一个示例,在需要 C 超过 A 的系统中,LRU缓存不是一个好选择吗?
答案 0 :(得分:1)
首先,缓存太小而无法容纳所有数据(可能发生逐出并且与LRU部分相关),这不是CAP定理的一个好例子,因为即使不看一致性,它也无法甚至可以同时提供分区容限和可用性。如果客户端请求的数据不在高速缓存中,并且网络分区阻止高速缓存及时从主数据库获取数据,那么它根本无法及时为客户端提供任何答案。
如果我们仅讨论缓存中实际的数据,则可能仅在该数据上应用CAP定理有些尴尬。然后,这取决于该缓存的使用情况。
同一台拥有权威数据的计算机上会发生很多缓存。例如,您的数据库管理系统(例如PostgreSql或其他)可能在RAM中缓存大量数据并从那里回答查询,而不是从磁盘上的持久性数据回答查询。即使如此,cache invalidation还是一个毛茸茸的问题。基本上,即使没有网络,有时也可以使用过时的信息(基本上会牺牲一致性),或者缓存系统需要了解数据更改并对此采取行动,这可能会变得非常复杂。 CAP定理仍然不适用,因为没有分布。或者,如果您想非常认真地看待总线(不是通常的放置方式),则一台计算机用于通信的各个部分都不具有 p 容错能力(CAP定理的第三部分) )。简而言之:如果您计算机的各个部分无法相互通信,则计算机将崩溃。
因此,在CAP方面,有趣的情况是主数据库和高速缓存在不可靠的网络连接的独立计算机上。在这种情况下,有两种基本的可能性:(1)缓存服务器可以在不询问主数据库其数据是否仍然有效的情况下应答请求,或者(2)在每次请求时都可以与主数据库进行检查。 (1)表示牺牲了一致性。如果是(2),则缓存的设计必须解决一个问题:如果缓存没有按时获得主数据库的答案(由于分区的原因,这是一些网络问题),缓存应该告诉客户端什么?在那种情况下,基本上只有两种可能性:它仍然可能对缓存的数据做出响应,冒着可能变得无效的风险。这是牺牲一致性。否则它可能告诉客户它现在无法回答。那就是在牺牲可用性。
总而言之