从 GuavaCache 迁移到 EhCache (Spring Boot)

Migrating from GuavaCache to EhCache (Spring Boot)

我正在尝试更改以下方法以使用 EhCache 缓存而不是 Guava 缓存,因为 Guava 缓存已从 Spring 5.0 中删除。似乎没有任何关于如何简单地实例化 EhCacheCache 对象并将其传递到 SimpleCacheManager 的在线文档。我该如何实现?

@Configuration
@EnableCaching
public class CacheConfig {

  @Bean
  public CacheManager cacheManager() {

    GuavaCache a =
        new GuavaCache("a", CacheBuilder.newBuilder().maximumSize(10000)
            .expireAfterAccess(24, TimeUnit.HOURS).recordStats().build());

    GuavaCache b =
        new GuavaCache("b", CacheBuilder.newBuilder().maximumSize(100)
            .expireAfterAccess(24, TimeUnit.HOURS).recordStats().build());

    GuavaCache c =
        new GuavaCache("c", CacheBuilder.newBuilder().maximumSize(100)
            .expireAfterAccess(24, TimeUnit.HOURS).recordStats().build());

    GuavaCache d =
        new GuavaCache("d", CacheBuilder.newBuilder().maximumSize(20)
            .expireAfterAccess(24, TimeUnit.HOURS).recordStats().build());

    GuavaCache e =
        new GuavaCache("e", CacheBuilder.newBuilder().maximumSize(100)
            .expireAfterAccess(24, TimeUnit.HOURS).recordStats().build());

    GuavaCache f =
        new GuavaCache("f", CacheBuilder.newBuilder().maximumSize(10)
            .expireAfterAccess(24, TimeUnit.HOURS).recordStats().build());

    GuavaCache g =
        new GuavaCache("g", CacheBuilder.newBuilder().maximumSize(5000)
            .expireAfterAccess(24, TimeUnit.HOURS).recordStats().build());

    SimpleCacheManager simpleCacheManager = new SimpleCacheManager();

    simpleCacheManager.setCaches(
      Arrays.asList(
        a,
        b,
        c,
        d,
        e,
        f,
        g
      )
    );

    return simpleCacheManager;
  }
}

这不是它的工作方式。假设您将使用 Ehcache 3.x,它符合 JSR107。所以你会使用JCacheCacheManager。 Spring-boot 会在类路径中看到 jcache api 可用时配置它而不做任何事情。

事实上,最简单的通常是放手,然后使用 JCacheManagerCustomizer 添加您想要的缓存。如下所示。

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public JCacheManagerCustomizer cacheManagerCustomizer() {
        return cm -> {
            cm.createCache("a", createConfiguration(100, Duration.ofHours(24)));
        };
    }

    private javax.cache.configuration.Configuration<Object, Object> createConfiguration(long size, Duration tti) {
        return Eh107Configuration.fromEhcacheCacheConfiguration(
            CacheConfigurationBuilder.newCacheConfigurationBuilder(Object.class, Object.class,
                ResourcePoolsBuilder.heap(size))
                .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(tti))
                .build());
    }
}