译者|李锐审稿人|孙书娟本文面向软件开发人员、技术经理、软件架构师、测试工程师以及其他有兴趣了解缓存在软件系统中的使用方式的人员。1、什么是缓存?(1)为什么需要缓存如今,现代软件系统变得越来越分布式和复杂,带来了很多挑战和问题,尤其是与系统性能相关的挑战和问题。缓慢的系统会导致企业失去信誉和盈利能力。下图显示了现代分布式架构的一个非常简单的视图。需要注意的是,实际架构会更加复杂,因为许多微服务(内部和外部)作为流程的一部分执行。系统设计中还会有其他组件,如消息系统、LDAP、规则引擎等。软件系统的层次结构如上图所示。不同组件之间有很多交互,需要跳转才能完成单个请求。由于组件的处理时间和下游组件响应的等待时间的累积,每个接触点的延迟都会增加。需要注意的是,处理时间可能是由于应用程序本身或下游系统所花费的时间,或者是由于网络的延迟(例如DNS查找、建立连接、网络传输时间等)。缓存通过将数据副本保持在靠近应用程序的客户端/组件的位置,在帮助提高系统性能方面发挥着重要作用。(2)缓存的工作原理如上图所示,软件系统中可以有不同的层次和交互。缓存可以应用于任何层,但缓存操作的基本原理保持不变。缓存的数据将用于避免昂贵的网络跳跃、来自底层数据库的调用或较慢的存储系统。下图显示了缓存在特定场景中的工作方式。这可以通过以下步骤序列来解释。需要注意的是,缓存的实现在不同的场景中可能会有所不同,但在较高层次上,基本方法是相同的。系统/组件收到发送回请求数据的请求。它将检查请求的数据是否在缓存中。如果数据在缓存中,则返回相同的缓存数据。否则,系统将从源(例如数据库、外部系统或API调用)获取数据,并用这些数据填充缓存。最后,这个数据被返回给调用者。(3)使用缓存的优点更好的应用程序性能:使用缓存的主要优点是提高了应用程序的性能。由于请求的数据通常在离应用程序较近的地方可用,因此可以将其返回并重新用于快速内存访问中的进一步处理。这有助于提高应用程序性能。避免不必要的磁盘访问/网络跳转:由于请求的数据通常在应用程序附近可用,因此在快速内存访问期间,这有助于避免不必要的跳转至较慢的组件,例如数据库、磁盘或通过网络调用其他组件/系统。这也有助于提高应用程序性能。更好的数据库可扩展性:由于现在对数据库的查询较少,因此可以释放其容量来处理其他请求。这减少了数据库负载/成本并提高了可伸缩性。其他后端系统/组件也是如此。(4)使用缓存时的重要注意事项在为给定场景设计缓存框架时,必须做出一些重要的决定。以下是缓存设计的一些关键方面的总结:应该缓存多少数据?在缓存中插入新数据时,哪些数据必须被移除或保留?缓存中的数据是否仍然相关,还是过时了?如何让缓存中的数据保持最新?如何保持低缓存未命中率?缓存的类型/风格和各种缓存策略方法将在以下各节中讨论。让我们了解这些影响缓存的行为并解决上面提出的一些问题。(5)多种缓存方式本文将讨论常用于管理底层数据存储更新场景的各种策略。如上所述,缓存未命中率应保持较低。缓存未命中是指在缓存中找不到请求的数据,而缓存命中是指请求的数据在缓存中找到并且不需要从源中检索。为了保持较低的缓存未命中率,缓存数据应保持最新。根据应用程序模式,可以使用以下技术之一来确保缓存中的数据尽可能最新。直写缓存:在这种技术中,数据首先在缓存中更新,然后在源系统中更新。这将确保缓存始终具有最新更新的数据。但是,这会导致源系统上发生的写入操作出现延迟。如果应用程序是写入密集型的,则不建议使用此方法。回写缓存:为了克服直写缓存的问题,可以使用回写缓存技术。同样在这种情况下,首先更新缓存。但是,缓存中的更新数据会异步同步回源系统。如果应用程序需要更高级别的源系统一致性,则不推荐使用此技术。Write-aroundcache:在这种技术中,数据直接在源系统中更新。缓存将定期刷新以更新数据存储中的数据。这有可能获取陈旧数据或增加缓存未命中率。2.缓存刷新策略示例下面总结了一些最流行的刷新缓存内容的技术。缓存可能需要刷新的原因可能有多种。由于缓存大小通常比源小得多,因此并非所有数据都可以缓存。随着缓存大小随着时间的推移而增长,它可能会变满。用更多需要或经常使用的数据替换缓存中的旧数据将降低缓存未命中率。以下是刷新缓存项的常用技术列表。(1)最近使用(MRU):在这种技术中,最近使用的缓存项首先被丢弃并由新项替换。(2)LeastRecentlyUsed(LRU):在该技术中,首先丢弃最近最少使用的项并用新项替换。(3)先进先出(FIFO):在这种技术中,第一个被插入到缓存中的项目首先被丢弃,并被一个新的项目所取代。(4)后进先出(LIFO):在这种技术中,最后插入缓存的项目首先被丢弃,并由新项目代替。(5)LeastRecentlyUsed(LFU):在这种技术中,缓存中最少使用的项目首先被丢弃,并被新项目取代。(6)最频繁使用(MFU):在这种技术中,缓存中最频繁使用的项目首先被丢弃,并被新项目取代。3.跨层缓存下表总结了缓存是如何在软件系统中跨层使用的,同时也重点介绍了一些可用于在给定场景中实现缓存的工具/框架。需要注意的是,在软件应用程序中,缓存可以应用于一层或多层。原文链接:https://dzone.com/articles/caching-across-layers-in-software-architecture
