Introduce Caching to Your Application
本文目录
- What caching is and why you should care about it
- How a cache works
- How to cache your OData Call
- How to configure the cache
Caches
有时,从您的应用程序到外部服务器的服务调用在性能和延迟方面非常昂贵。一旦达到客户和客户的关键响应时间,对查询数据的进一步评估会使事情变得更糟。
为了提高对用户的响应能力,您的应用程序内部请求的数据通常可以存储以供后续调用使用。这可以通过这样的方式来实现,即对于每个请求,应用程序之前存储的信息都可以重复使用。这种一般行为称为缓存。缓存存储通过它的信息的副本。除了提高响应能力外,技术目标是降低整体所需的带宽和处理要求,从而最终减少服务器负载和感知延迟。通过这种方式,可以减少需要跨网络传输的信息量。
缓存在各种用例中都非常重要。这是我们现代互联网体验进步的原因之一,例如按需多媒体流媒体和持久云存储。与保存整个请求和响应文档的 Web 缓存不同,内部应用程序缓存用于为多个预期用途持久保存临时数据。每当信息的计算或检索成本很高,并且不止一次需要它在某个输入上的值时,就应该考虑缓存。
How do they work
缓存通常通过向给定主题(称为键)请求信息的操作来工作。如果先前请求给定键的信息,在请求时存储,并且现在可以读取,则会发生所谓的“缓存命中”:可以找到数据并将加载。当它不能时会发生“缓存未命中”。
缓存最重要的方面是其大小和其项目的生命周期。两者都应针对用例进行限制,以避免应用程序中出现过时的状态或不成比例的内存消耗。当应用程序从外部源重复读取更大的数据块时,可以看到使用缓存的最大影响。在这种情况下,使用缓存会显着减少传输信息所需的带宽。
缓存适用于:
- 你愿意花一些内存来提高速度。
- 您希望密钥有时会被多次查询。
- 您的缓存不需要存储比 RAM 所能容纳的更多的数据。
(默认情况下,缓存在应用程序的单次运行中是本地的。它不会将数据存储在文件中,也不会存储在外部服务器上。)
如果这些要求适用于您的用例,我们强烈建议您在应用程序中使用 SAP Cloud SDK 提供的缓存功能。现在您已经了解了缓存为何有用,您将了解 Cloud SDK 提供了什么来启用它。
Caching with SAP Cloud SDK
Cloud SDK 可以轻松地缓存您的请求,因为它可以在后台处理大部分复杂性。 这包括处理租户感知请求,这在多租户应用程序中是必不可少的。 如果您的请求需要,SDK 将自动隔离租户或主体级别的缓存。
在 SAP Cloud SDK 中,JCache (JSR 107) 用作底层缓存技术。 在本文的例子中,您将为此使用 JCache 适配器 Caffeine,但您可以使用任何您喜欢的实现。 对于 Caffeine,将以下依赖项添加到您的应用程序 pom.xml:
com.github.ben-manes.caffeine
jcache
runtime
2.7.0
Cache your OData call
既然我们已经讨论了为什么缓存很重要,以及它如何帮助我们提高性能和响应能力,现在是时候将它引入您的应用程序了。
现在,为了使我们的 OData 调用可缓存,您将增强 ResilienceConfiguration 并向其添加 CacheConfiguration.
在 GetBusinessPartnerCommand 的构造函数末尾添加以下几行:
./application/src/main/java/com/sap/cloud/sdk/tutorial/GetBusinessPartnersCommand.java
final ResilienceConfiguration.CacheConfiguration cacheConfig =
ResilienceConfiguration.CacheConfiguration
.of(Duration.ofSeconds(10))
.withoutParameters();
myResilienceConfig.cacheConfiguration(cacheConfig);
如上所述,ResilienceConfiguration 用于集成缓存功能,在 CacheConfiguration 中进行了描述。您的配置有两个步骤:
a. 确定对象要缓存多长时间
b. 声明需要与缓存数据一起存储的参数
第一步显然是必要的,因为数据应该只存储有限的时间。保存缓存信息的时间越长,它就会变得越过时。您希望将数据缓存多长时间取决于您的特定用例。您预计信息过时的速度有多快?访问数据的频率如何?超时设置了数据是最新的和应用程序响应之间的权衡。
其次,您指定要与数据一起缓存的参数。对于检索业务合作伙伴列表的请求,不需要参数,因此您可以使用htoutParameters 构建缓存。但是假设您想通过将 ID 传递给系统来获取有关特定业务合作伙伴的信息。为了缓存这样的请求,缓存不仅需要记住接收到的结果,还需要记住与之关联的 ID。在这种情况下,可以使用 .withParameters(param1, param2, ..) 简单地传递这些参数。
随意测试与发出的第一个请求相比,后续请求的响应速度更快。在本地或云中部署您的应用程序,并多次访问业务合作伙伴列表。