视频

了解更多
下载《大规模缓存》电子书。您需要了解应用程序缓存是什么、为什么以及何时需要它,以及如何从应用程序中获得最佳性能的入门指南。
如果您相信拉尔夫·沃尔多·爱默生,愚蠢的一致性可能是小人物的恶灵,但当谈到实施可扩展、成功的企业级缓存策略时,一致性就没有什么愚蠢之处。事实上,管理企业数据库运行的最大挑战之一就是维护缓存一致性。
我们为什么要费心使用缓存呢?企业缓存的主要优势是访问数据的速度和效率。虽然每次对主数据库的调用在时间和处理能力方面都可能很昂贵,但对缓存的调用可以非常快,并且不会影响主数据库。
当然,这些优势依赖于一个基本假设,即缓存中—或缓存中—的数据始终与源数据保持相同的值。虽然这看起来是一个直接的目标,但在理论上比实践中容易。事实上,有三个陷阱可能会破坏它:
1. **当对主数据库的更改未反映在缓存中时**
因为通过缓存访问数据比通过主数据库访问数据快,所以如果请求特定项目,将首先查询缓存。假设该项目存在于缓存中,它将比从主数据库返回快得多。这种策略被称为缓存旁路模式。默认情况下,首先检查缓存。如果数据不在缓存中,应用程序将查询主数据库,并在返回给用户时将结果存储在缓存中。
问题出现在主数据库中的数据发生更改与缓存调整以反映该更改之间的间隙。这受应用程序检查缓存的频率的影响。但是,每次检查都会消耗处理器资源。同一个处理器可能同时处理许多其他功能或事务,其中一些功能或事务与更新缓存一样重要,甚至更重要。
挑战在于找到最佳位置,一种介于过于频繁地检查更新和检查更新不足之间的“金发姑娘”区域。当然,如果用户在此间隙内尝试访问过时数据,则该赌注将失败。
2. 当更新缓存结果存在延迟时
此问题与上一个问题略有重叠。每次在主数据库中更新值时,都会向缓存发送一条消息,指示它要么更新更改的值,要么完全删除它。(在后一种情况下,下次请求该值时,将从主数据库访问该值,然后从缓存中访问该值。)在正常情况下,这种通信发生得很快,并且缓存项目会被更新或删除,以保持缓存一致性。
但是,再次强调,此更改需要处理能力,并且需要时间。延迟受可用处理速度以及网络吞吐量的影响。如果用户不幸在服务器发送更新缓存的消息与缓存接收该消息并对其进行处理的时间之间选择访问过时数据,则结果可能是数据过时、不正确或两者兼而有之。
3. 当缓存节点之间存在不一致时
当然,网站或应用程序越大,缓存存储在多个节点而不是单个节点上的可能性就越大。除了主节点之外,可能还有任意数量的副本节点,这些节点理想情况下存储相同的数据。从负载均衡和性能的角度来看,这样做通常是有意义的。
但是从数据完整性的角度来看,这引入了另一个潜在的缓存不一致来源。每次在主数据库中更新数据时,都需要将此更改反映在所有副本中。根据这些节点的地理位置以及数量,更新过程可能需要很长时间。虽然更新过程可能正在进行,但仍然很有可能用户会访问尚未进行更改的节点。再一次,结果是可以预料的,那就是缓存不一致。
对于缓存数据库的所有好处,缓存不一致的可能性也许是其最显着的缺点。但问题有多大?最终,缓存不一致的成本取决于上下文。
某些缓存不一致可能会发生而不会造成太大后果。例如,如果您的缓存中的总“喜欢”次数暂时与您的主数据库中的实际总数不同步,则短暂的差异不太可能导致问题,甚至不会被注意到。
另一方面,如果缓存列出某一特定产品的剩余项目仍有库存,而主数据库中的实际库存显示已无库存,则由此产生的冲突可能会让您的客户感到困惑和疏远,损害您品牌在可靠性方面的声誉,对公司的交易和会计造成严重破坏,并在极端情况下,甚至会使您陷入法律困境。
幸运的是,对于上述每个潜在的缓存不一致来源,都有相应数量的解决方案。
1. 缓存失效
使用缓存失效,每当在主数据库中更新值时,每个具有对应键的缓存项目都会从缓存或缓存中自动删除。虽然缓存失效可能被视为一种“蛮力方法”,但其优点是它只需要进行一次昂贵且耗时的写入操作—对主数据库本身进行操作—而不是两次或更多次。
2. 写入缓存
在这种情况下,应用程序不是更新主数据库并删除缓存,而是使用写入策略,应用程序更新缓存,然后缓存同步更新主数据库。换句话说,缓存负责维护自身一致性,并将它所做的任何更改传递回主数据库,而不是依赖主数据库来启动任何更新。
3. 写入后缓存
不幸的是,有时两次写入实际上会导致错误。写入缓存策略的缺点之一是,更新缓存和主数据库都需要进行两次耗时、占用处理器的更改,首先是更改缓存,然后是更改主数据库。
另一种称为写入后的策略通过最初只更新缓存,然后稍后更新主数据库来避免此问题。当然,主数据库也需要更新,越早越好,但在这种情况下,用户不必支付两次写入的“成本”。第二次写入主数据库异步并在后台(因此得名写入后)发生,此时不太可能影响性能。
除了缓存失效之外,写入和写入后缓存还可以解决许多有助于您实现缓存一致性的场景。但找到问题的答案与实施它并不相同。
Redis 企业版的主动-主动 地理复制允许使用多个主节点,并使您能够熟练地处理越来越重的负载。“主动-主动”这个名字指的是您的数据库的每个实例都可以接受对任何键的读写操作。每个数据库实例,无论距离多远,都是您网络上的一个对等节点。这意味着当对任何实例进行写入时,该节点会自动向您网络上的所有其他实例发送消息,指示缓存中发生了什么更改,并确保所有实例都保留一致的缓存数据集。
Redis 企业版的独特主动-主动地理复制采用经过精心设计的算法来处理可能导致缓存不一致的潜在写入冲突。这些算法基于无冲突复制数据类型 (CRDT),确保来自多个副本的写入可以以有效地维护一致性的方式合并。
由于随着架构的增长,维护缓存一致性的挑战变得更加复杂,并且其后果也越来越大,因此您需要一个企业级缓存解决方案来可靠地提供您的业务所需的以及您的客户期望的一致性。
对于爱默生来说,一致性可能是一个小妖精,但在企业级数据库缓存方面,它绝对是必不可少的。这就是选择 Redis Enterprise 的明智之举。你不选择它,你就是傻瓜。
了解缓存的全部故事。阅读 Lee Atchison 撰写的 Redis 规模化缓存。