共计 1882 个字符,预计需要花费 5 分钟才能阅读完成。
缓存是几乎所有应用程序性能的关键。有时需要分布式缓存,但并非总是如此。在许多情况下,本地缓存可以正常工作,并且不需要分布式缓存的开销和复杂性。
因此,在许多应用程序中,包括普通的 Spring 和 Spring Boot,您可以在任何方法上使用@Cacheable
,其结果将被缓存,以便下次调用该方法时,返回缓存的结果。
Spring 有一些默认的缓存管理器实现,但外部库总是比简单的实现更好、更灵活。例如,Caffeine 是一个高性能的 Java 缓存库。Spring Boot 带有一个CaffeineCacheManager
. 因此,理想情况下,您只需创建一个缓存管理器 bean 并为您的带有@Cacheable
注释的方法缓存。
但是,提供的缓存管理器允许您仅配置一种缓存规范。缓存规范包括到期时间、初始容量、最大大小等。因此,此缓存管理器下的所有缓存都将使用单个缓存规范创建。缓存管理器支持预定义缓存列表以及动态创建的缓存,但在这两种情况下都使用单个缓存规范。这对生产很少有用。作为一般规则,您必须小心使用内置缓存管理器。
这篇文章 告诉您如何使用自定义规范定义自定义缓存。但是,这些选项不支持内置管理器支持的动态默认缓存规范用例。理想情况下,您应该能够使用任何名称@Cacheable
并自动使用某些默认规范创建缓存,但您还应该可以选择覆盖特定缓存的名称。
这就是为什么我决定使用比在代码中定义所有缓存更简单的方法,以提供更大的灵活性。它扩展了CaffeineCacheManager
提供该功能:
/**
* Extending Caffeine cache manager to allow flexible per-cache configuration
*/
public class FlexibleCaffeineCacheManagerextends CaffeineCacheManagerimplements InitializingBean {private Map cacheSpecs =new HashMap();
private Map> builders =new HashMap();
private CacheLoader cacheLoader;
@Override
public void afterPropertiesSet()throws Exception {for (Map.Entry cacheSpecEntry : cacheSpecs.entrySet()) {builders.put(cacheSpecEntry.getKey(), Caffeine.from(cacheSpecEntry.getValue()));
}
}
@Override
@SuppressWarnings("unchecked")
protected Cache
简而言之,它为每个规范创建一个咖啡因构建器,并在需要新缓存时使用它而不是默认构建器。
然后示例 XML 配置将如下所示:
使用 Java 配置非常简单——您只需设置cacheSpecs
映射。
虽然 Spring 已经变成了一个提供各种功能的庞大框架,但它并没有放弃可扩展性的设计原则。
扩展内置框架类是经常发生的事情,它应该在每个人的工具箱中。这些类是在考虑扩展的情况下创建的 – 您会注意到CaffeineCacheManagerare
中的许多protected
方法。所以我们应该在需要的时候利用它。
原文地址: 使用 Caffeine 和 Spring Boot 的多个缓存配置