Spring Cache與Ehcache 3整合

banq發表於2021-11-05

在本文中,我們將研究一些 Spring Cache 概念,然後整合 Ehcache 3。

預設情況下,由於沒有額外的提供者,Spring Cache 使用 JCache,它是Spring-Cache-Starter作為依賴項新增時存在於類路徑上的預設提供者。它只不過是一個簡單的 ConcurrentHashMap。

現在有很多支援的快取提供程式,我們可以與Spring快取整合,如Redis、Couchbase、Hazelcast等。今天我們將看看如何整合Ehcache 3。

 

Spring Cache介紹

控制器:

@RestController  
public class WebService {  
  
    @Autowired  
    private Service service;  
  
  
   @GetMapping("/{name}")  
    public Person generatePerson(@PathVariable(value = "name") String name) {  
    return service.generatePerson(name);  
}

服務類:

@org.springframework.stereotype.Service  
public class Service {  
  
    Logger logger = LoggerFactory.getLogger(Service.class);  
  
    @Cacheable(cacheNames = "cacheStore", key = "name")  
    public Person generatePerson(String name) {  
        Person person = new Person(UUID.randomUUID().toString(), name, "Switzerland");  
        logger.info("Generated Person: {}", person);  
        return person;  
    }

方法generatePerson有一個cachable註釋定義了一個名為 的快取cacheStore。通過這種方式,您可以配置將儲存鍵值對的快取。這裡,值是函式的結果,鍵是輸入引數的名稱。

要定義您的鍵,您可以使用 Spring 的表示式語言 ( SpEL ) 格式。如果您不提供鍵,它將使用輸入作為鍵本身。

 

 

將 Ehcache 3 與 Spring Cache 整合 

為了整合Ehcache 3,我們需要新增以下兩個依賴。

<dependency>  
   <groupId>org.ehcache</groupId>  
   <artifactId>ehcache</artifactId>  
</dependency>  
  
<dependency>  
   <groupId>javax.cache</groupId>  
   <artifactId>cache-api</artifactId>  
</dependency>

我們不會在這裡指定它的版本,因為 spring starter 知道哪個依賴版本是相容的。

預設情況下,Spring Cache 僅支援 Ehcache 2.x 版本,因此我們必須新增一些配置才能使其與版本 3 相容。

@Configuration  
public class AppConfig {  
  
    @Bean  
    public CacheManager EhcacheManager() {  
  
        CacheConfiguration<String, Person> cachecConfig = CacheConfigurationBuilder  
          .newCacheConfigurationBuilder(String.class,  
                        Person.class,  
                      ResourcePoolsBuilder.newResourcePoolsBuilder()  
                                .offheap(10, MemoryUnit.MB)  
                                .build())  
.withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofSeconds(10)))  
                .build();  
  
     CachingProvider cachingProvider = Caching.getCachingProvider();  
     CacheManager cacheManager = cachingProvider.getCacheManager();  
       
   javax.cache.configuration.Configuration<String, Person> configuration = Eh107Configuration.fromEhcacheCacheConfiguration(cachecConfig);  
        cacheManager.createCache("cacheStore", configuration);  
        return cacheManager;  
    }  
}

在這裡,我們做了一些配置來定義一個cacheStore具有快取過期和快取大小等屬性的快取。如果沒有來自快取的鍵請求,我們將過期時間設定為 10 秒,並且還設定了 10 MB 的堆外大小用於快取。

程式碼已上傳到GitHub

相關文章