多个 Caffeine LoadingCaches 添加到 Spring CaffeineCacheManager
Multiple Caffeine LoadingCaches added to Spring CaffeineCacheManager
我想将几个不同的 LoadingCache
添加到 Spring CacheManager
,但是我不明白如何使用 CaffeineCacheManager
。似乎只有一个加载器可以用于刷新内容,但是我需要为每个缓存使用单独的加载器。是否可以向 Spring 缓存管理器添加多个加载缓存?如果是,那又如何?
CaffeineCacheManager cacheManage = new CaffeineCacheManager();
LoadingCache<String, Optional<Edition>> loadingCache1 =
Caffeine.newBuilder()
.maximumSize(150)
.refreshAfterWrite(5, TimeUnit.MINUTES)
.build(test -> this.testRepo.find(test));
LoadingCache<String, Optional<Edition>> loadingCache2 =
Caffeine.newBuilder()
.maximumSize(150)
.refreshAfterWrite(5, TimeUnit.MINUTES)
.build(test2 -> this.testRepo.find2(test2));
// How do I add to cache manager, and specify a name?
是的,这是可能的。由于您需要微调每个缓存,因此您可能更擅长自己定义它们。回到您的示例,下一步将是:
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(
new CaffeineCache("first", loadingCache1),
new CaffeineCache("second", loadingCache2)));
然后你就可以照常使用它了,例如
@Cacheable("first")
public Foo load(String id) { ... }
如果您正在使用 Spring 引导,您可以将单个缓存公开为 beans(因此 org.springframework.cache.Cache
实现),我们将检测它们并自动创建一个 SimpleCacheManager
你.
请注意,此策略允许您使用具有不同实现的缓存抽象。 first
可能是咖啡因缓存,second
可能是来自其他提供商的缓存。
拥有这个 class 将允许您像往常一样在您想要的地方使用 @Cacheable("cacheA")
:
@EnableCaching
@Configuration
public class CacheConfiguration {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager manager = new CaffeineCacheManager();
manager.registerCustomCache("cacheA", defaultCache());
manager.registerCustomCache("cacheB", bigCache());
manager.registerCustomCache("cacheC", longCache());
// to avoid dynamic caches and be sure each name is assigned to a specific config (dynamic = false)
// throws error when tries to use a new cache
manager.setCacheNames(Collections.emptyList());
return manager;
}
private static Cache<Object, Object> defaultCache() {
return Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
}
private static Cache<Object, Object> bigCache() {
return Caffeine.newBuilder()
.maximumSize(5000)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
}
private static Cache<Object, Object> longCache() {
return Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(1, TimeUnit.HOURS)
.build();
}
}
我想将几个不同的 LoadingCache
添加到 Spring CacheManager
,但是我不明白如何使用 CaffeineCacheManager
。似乎只有一个加载器可以用于刷新内容,但是我需要为每个缓存使用单独的加载器。是否可以向 Spring 缓存管理器添加多个加载缓存?如果是,那又如何?
CaffeineCacheManager cacheManage = new CaffeineCacheManager();
LoadingCache<String, Optional<Edition>> loadingCache1 =
Caffeine.newBuilder()
.maximumSize(150)
.refreshAfterWrite(5, TimeUnit.MINUTES)
.build(test -> this.testRepo.find(test));
LoadingCache<String, Optional<Edition>> loadingCache2 =
Caffeine.newBuilder()
.maximumSize(150)
.refreshAfterWrite(5, TimeUnit.MINUTES)
.build(test2 -> this.testRepo.find2(test2));
// How do I add to cache manager, and specify a name?
是的,这是可能的。由于您需要微调每个缓存,因此您可能更擅长自己定义它们。回到您的示例,下一步将是:
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(
new CaffeineCache("first", loadingCache1),
new CaffeineCache("second", loadingCache2)));
然后你就可以照常使用它了,例如
@Cacheable("first")
public Foo load(String id) { ... }
如果您正在使用 Spring 引导,您可以将单个缓存公开为 beans(因此 org.springframework.cache.Cache
实现),我们将检测它们并自动创建一个 SimpleCacheManager
你.
请注意,此策略允许您使用具有不同实现的缓存抽象。 first
可能是咖啡因缓存,second
可能是来自其他提供商的缓存。
拥有这个 class 将允许您像往常一样在您想要的地方使用 @Cacheable("cacheA")
:
@EnableCaching
@Configuration
public class CacheConfiguration {
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager manager = new CaffeineCacheManager();
manager.registerCustomCache("cacheA", defaultCache());
manager.registerCustomCache("cacheB", bigCache());
manager.registerCustomCache("cacheC", longCache());
// to avoid dynamic caches and be sure each name is assigned to a specific config (dynamic = false)
// throws error when tries to use a new cache
manager.setCacheNames(Collections.emptyList());
return manager;
}
private static Cache<Object, Object> defaultCache() {
return Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
}
private static Cache<Object, Object> bigCache() {
return Caffeine.newBuilder()
.maximumSize(5000)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
}
private static Cache<Object, Object> longCache() {
return Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(1, TimeUnit.HOURS)
.build();
}
}