Spring Boot缓存提供者

Spring Boot框架允许集成各种缓存提供者,如EhCache、Redis、Hazelcast、Infinispan、Caffeine等。缓存提供者使开发人员能够在应用程序中透明且明确地配置缓存。我们应该使用缓存,因为它减少了执行次数,提高了应用程序的性能。

在Spring Boot中,缓存抽象并不提供实际的缓存空间。它依赖于org.springframework.cache.Cache或org.springframework.cache.CacheManager接口引发的抽象。

缓存自动配置

Spring Boot框架通过自动配置支持简化了缓存的实现。它在类路径中搜索库和配置文件,并在应用程序启动时初始化所需的依赖项bean。缓存的自动配置包括以下步骤:

1.在配置文件中添加@EnableCaching注解。
2.在类路径中添加所需的缓存库。
3.在类路径的根目录中,添加缓存提供者的配置文件。

例如,如果我们想在应用程序中实现EhCache,首先要在配置文件中启用缓存。

@SpringBootApplication  
@EnableCaching  
public class Employee  
{  
@Bean  
public CacheManager cacheManager()  
{  
//some code  
}  
}  

在pom.xml文件中添加EhCache依赖项。它会在类路径中添加所需的库。

<dependency>  
<groupId>org.ehcache</groupId>  
<artifactId>ehcache</artifactId>  
</dependency>  

最后,在缓存提供者的配置文件中进行配置。在这里,我们正在使用EhCache,因此需要在类路径的根目录下配置ehcache.xml文件。

当我们未定义类型为CacheManager或CacheResolver的bean时,Spring Boot框架会尝试检测以下缓存提供者:

  • Generic
  • JCache
  • EhCache
  • Hazelcast
  • Infinispan
  • Couchbase
  • Redis
  • Caffeine
  • Simple

如果Spring Boot在类路径中找到多个缓存提供者,在这种情况下,我们必须在application.properties文件中明确指定缓存提供者。

spring.cache.ehcache.provider=net.sf.ehcache.CacheManager  
spring.cache.ehcache.config=classpath:config/another-config.xml  

我们可以通过使用属性spring.cache.type来设置特定的缓存提供者。在某个环境中,如果我们想要禁用缓存,可以使用它。

spring.cache.type=none  

Spring Boot框架提供了一个starter依赖项,它在应用程序中添加基本的缓存依赖项。默认情况下,starter cache依赖项提供spring-context-support依赖项。

注意:如果我们手动添加缓存依赖项,必须在pom.xml文件中包含spring-context-support依赖项,因为它为JCache、EhCache和Caffiene提供了支持。

<dependency>  
<groupId>org.springframework</groupId>  
<artifactId>spring-context-support</artifactId>  
<version>5.2.3.RELEASE</version>  
</dependency>  

Spring Boot框架会自动配置CacheManager,可以通过实现CacheManagerCustomizer接口进行进一步的定制。

在下面的示例中,我们设置了一个标志,将null值传递给主映射。

@Bean  
public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer()   
{  
return new CacheManagerCustomizer<ConcurrentMapCacheManager>()   
{  
@Override  
public void customize(ConcurrentMapCacheManager cacheManager)   
{  
cacheManager.setAllowNullValues(false);  
}  
};  
}  

上面的bean期望一个自动配置的ConcurrentMapCacheManager。如果未自动配置ConcurrentMapCacheManager,定制器将不会以任何方式调用。我们可以拥有任意数量的定制器,并通过使用注解@Order或@Ordered来排列它们的顺序。

通用缓存

如果spring-context-support至少定义了一个org.springframework.cache.Cache bean,它将使用通用缓存。CacheManager捆绑了所有bean并对其进行了配置。

JCache JCache是由javax.cache.spi.CahingProvider提供的自启动过程。它存在于类路径JSR 107中。spring-boot-starter-cache提供了JCacheCacheManager。我们还可以添加任何其他缓存库。

注意:如果缓存库同时提供了本地实现和JSR支持,Spring Boot更喜欢JSR支持。

EhCache2.x

EhCache是基于Java的开源缓存,被广泛使用。为了使用EhCache,我们应该使用以下依赖项。

<dependency>  
<groupId>org.ehcache</groupId>  
<artifactId>ehcache</artifactId>  
</dependency>  

有两种配置EhCache的方法:

首先,通过配置Java POJO文件,在此文件中,通过EhCache API配置所有配置参数。 其次,通过配置XML文件,在此文件中,我们根据提供的模式定义配置EhCache。 EhCache使用一个名为ehcache.xml的文件。如果应用程序在类路径上找到该文件,则由spring-boot-starter-cache提供的EhCacheCacheManager将会启用。我们可以使用以下属性配置XML文件:

spring.cache.ehcache.config=classpath:config/demo-config.xml  

Hazelcast 当我们在应用程序中启用缓存时,Spring Boot会自动将HazelcastInstance包装在CacheManager中。它在节点之间均匀分布数据。我们可以使用以下属性来配置Hazelcast。

spring.hazelcast.config=classpath:config/demo-hazelcast.xml  

如果未设置属性,Spring Boot会尝试在类路径上找到hazelcast.xml(Hazelcast配置)文件。

Infinispan Infinispan是一个嵌入式Java库,用作缓存或数据网格。它以键-值形式存储数据。它可以轻松地与JCache、JPA Quarkus、Spring等集成。

它没有默认的文件位置,因此我们应该明确指定它。如果未明确指定infinispan,则使用默认的引导。

spring.cache.infinispan.config=infinispan.xml   

Couchbase 当我们实现couchbase-spring-cache并配置了Couchbase时,CouchebaseCacheManager会自动配置。与缓存相关的所有操作都在Bucket中执行。通过设置属性spring.cache.cache-name,它允许我们创建额外的缓存(如果需要)。

通过使用自定义器,我们可以在其中创建其他Bucket,从而可以创建另一个缓存。

让我们通过一个示例来理解上述概念。

假设我们需要三个名为cacheA、cacheB和cacheC的缓存。cacheA和cacheB位于主Bucket上(即自动配置的Bucket)。cacheC位于另一个Bucket上,该Bucket将在几秒钟内存活,比如4秒钟。因此,我们可以通过以下方式创建cacheA和cacheB:

spring.cache.cache-names=cacheA, cacheB  

Redis 当我们配置Redis时,RedisCacheManager会自动配置。它还允许我们通过使用属性spring.cache.cache-names来创建其他缓存。可以使用属性spring.cache.redis.*来获得默认配置。

通过使用RedisCacheConfiguration bean,我们可以完全控制默认配置。

spring.cache.cache-names=cacheA, cacheB  
spring.cache.redis.time-to-live=100000  

上述属性配置了两个缓存,名称分别为cacheA和cacheB,生存时间为10分钟。

Caffeine Caffeine是一个基于Java的缓存库。它还提供了内存中的缓存。如果在类路径中找到Caffeine,spring-boot-starter-cache依赖项将自动配置CaffeineCacheManger。如果要在应用程序中使用Caffeine,需要添加以下依赖项:

<dependency>  
<groupId>com.github.ben-manes.caffeine</groupId>  
<artifactId>caffeine</artifactId>  
<version>2.7.0</version>  
</dependency>  

Caffeine缓存允许我们使用属性spring.cache.caffeine.spec定义缓存的大小和存活时间。例如:

spring.cache.cache-names=cacheA,cacheB  
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s  

上面的配置创建了两个缓存,名称分别为cache1和cache2。缓存的最大大小为500,最大存活时间为6秒。

Simple 这是默认的实现。如果未指定缓存提供者,它会配置一个ConcurrentHashMap作为缓存存储,如果Spring Boot在类路径中未找到任何缓存提供者。

例如,如果我们想要两个缓存,可以使用以下属性设置它们的名称:

spring.cache.cache-names=cache1,cache2  

None 当我们使用@EnableCaching注解启用缓存时,应用程序会期望适当的配置。当我们希望在某个环境中禁用缓存时,可以使用它。我们使用属性spring.cache.type来禁用缓存。

spring.cache.type=none  

标签: spring, Spring教程, Spring语言学习, Spring框架, Spring框架教程, Spring框架高级教程, spring boot, spring boot入门教程, spring boot学习教程, spring boot下载, spring boot框架入门, spring boot面试题, spring boot笔试题, spring boot学习指南, spring boot技术