我有一个简单的sprint启动应用程序1.5.11.RELEASE,@EnableCaching在Application Configuration类上使用spring boot .
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
spring.cache.type=caffeine
spring.cache.cache-names=cache-a,cache-b
spring.cache.caffeine.spec=maximumSize=100, expireAfterWrite=1d
Run Code Online (Sandbox Code Playgroud)
我的问题很简单,如何为每个缓存指定不同的大小/到期时间.也许它可能cache-a是有效的1 day.但cache-b也许可以1 week.关于咖啡因缓存的规范似乎是全局的,CacheManager而不是Cache.我错过了什么吗?也许我的用例有更合适的提供商?
我正在尝试使用Caffeine作为LRU缓存,因此首先添加的条目将首先被逐出.跑这段代码:
final Cache<Object, Object> map = Caffeine.newBuilder()
.maximumSize(10)
.initialCapacity(10)
.build();
for (long i=0; i<20;i++) {
map.put(i, i);
}
map.cleanUp();
System.out.println(map.ge.getAllPresent(map.asMap().keySet()));
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 19=19}
Run Code Online (Sandbox Code Playgroud)
但我期待
{10=10, 11=11, 12=12, 13=13, 14=14, 15=15, 16=16, 17=17, 18=18, 19=19}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我想在LoadingCacheSpring 上添加几个不同的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?
Run Code Online (Sandbox Code Playgroud) 我正在尝试进一步了解咖啡因缓存。我想知道是否有一种方法可以为缓存中填充的条目指定超时,但其余记录没有基于时间的到期时间。
本质上我希望有以下界面:
put(key, value, timeToExpiry)// 输入具有指定 timeToExpiry 的键和值
put(key, value)// 输入没有 timeToExpiry 的键值
我可以编写接口和管道,但我想了解如何配置咖啡因以满足上述两个要求。我也愿意拥有两个单独的咖啡因缓存实例。
我正在使用带有 spring 注释的咖啡因缓存提供程序,当条目\xe2\x80\x99s 放入缓存或驱逐或缓存上发生的任何活动时,我无法看到来自 caffeinecachemanager 的日志。我是否必须明确提及属性启用或禁用咖啡因日志?
\n\n任何人都可以帮助解决以下问题吗?\n当 @cachable 填充缓存时如何记录消息?\n当缓存条目从缓存中逐出时如何记录?\n有什么方法可以检查以缓存名称存储的所有缓存条目吗?\ n使用spring注解和CaffeineCacheManager时是否需要AOP配置。?如果是这样,请帮助示例。
\n我正在开发一个大型 Spring Boot 2.1.5.RELEASE 应用程序,使用 Caffeine 作为缓存提供程序。为了防止 I/O 瓶颈,我LoadingCache<K,V>在(基本上)以下方式中使用了咖啡因:
LoadingCache<K, V> cache = Caffeine.newBuilder()
.refreshAfterWrite(1, TimeUnit.MINUTES)
.build(loadStuffOverHttp());
Run Code Online (Sandbox Code Playgroud)
据我所知,如果不使用LoadingCache.
但是,LoadingCache 没有实现 Spring 的Cache. 这意味着我不能依赖@Bean方法来注册我的缓存,每个缓存都需要进行不同的配置。理论上,在 Spring 上下文中注册将允许它们与 Spring 的@Cacheable注释结合使用。
从我从CaffeineCacheConfiguration.java的源代码中可以看出,我也不能依赖 Spring Boot 的自动配置。类型的 Bean CaffeineCache(用于 Caffeine 的Spring 缓存适配器模式Cache<K,V>)是自动注册的,但适配器强制我将其<Object, Object>用作CacheLoader<K, V>. 我只想把这作为最后的手段。
这个 SO 问题表明可以以编程方式配置不同的缓存:
只需将您的自定义缓存公开为 bean。它们会自动添加到
CaffeineCacheManager.
但是,使用LoadingCache<K, V>(使用任意K, V, not <Object, Object> …
我正在 Kotlin 和 Spring Boot 项目中工作,我正在尝试使用 Caffeine 进行缓存。我有一个具有暂停功能的服务,可以进行 http 调用。这是我的配置:
@Bean
open fun caffeineConfig(): @NonNull Caffeine<Any, Any> {
return Caffeine.newBuilder().expireAfterWrite(60, TimeUnit.SECONDS)
}
@Bean
open fun cacheManager(caffeine: Caffeine<Any, Any>): CacheManager {
val caffeineCacheManager = CaffeineCacheManager()
caffeineCacheManager.getCache("test")
caffeineCacheManager.setCaffeine(caffeine)
return caffeineCacheManager
}
Run Code Online (Sandbox Code Playgroud)
这是我想要缓存的函数:
@Cacheable(value = ["test"])
open suspend fun getString(id: String): String {
return client.getString(id)
}
Run Code Online (Sandbox Code Playgroud)
但似乎缓存不起作用,因为我可以从日志中看到每次调用服务函数时都会调用客户端。不适@Cacheable用于暂停功能?或者我还缺少其他东西吗?
我在使用spring cache abstraction设置jcache时遇到问题.
@Configuration
@EnableCaching
public class CacheConfig {
@Bean(name = "caffeineCachingProvider")
public CachingProvider caffeineCachingProvider() {
return new CaffeineCachingProvider();
}
@Bean(name = "caffeineCacheManager")
public JCacheCacheManager getSpringCacheManager() {
CacheManager cacheManager = caffeineCachingProvider().getCacheManager();
CaffeineConfiguration<String, List<Product>> caffeineConfiguration = new CaffeineConfiguration<>();
caffeineConfiguration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(new AccessedExpiryPolicy(new Duration(TimeUnit.MINUTES, 60))));
Cache<String, List<Product>> productCache = cacheManager.createCache("productCache", caffeineConfiguration);
JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);
return jCacheCacheManager;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Caffein作为Jcache.我只是无法理解我做错了什么.你能解释一下如何正确地做到这一点吗?
我得到的是NPE在线cacheManager.createCache(...)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'caffeineCacheManager' defined in com.myapp.spring.config.CacheConfig: Bean instantiation via factory method …Run Code Online (Sandbox Code Playgroud) 我在我的 Web 应用程序中使用 Spring Boot 缓存支持,并将Caffeine设置为缓存提供程序。
我的项目中有几个缓存,大多数都有通用的配置,但是对于两个特定的缓存我需要设置不同的参数。
在我的application.properties我有类似的东西:
spring.cache.cache-names=a-cache,b-cache,c-cache, ...
spring.cache.caffeine.spec=maximumSize=200,expireAfterWrite=3600s
Run Code Online (Sandbox Code Playgroud)
这适用于常见的缓存。然后我想用自定义参数扩展这个配置。
这篇文章解释了如何通过@Configuration类配置缓存,但使用这种方法我完全覆盖了通用配置。
我需要的是这样的:
@Configuration
public class CacheConfiguration {
@Autowired
private CacheManager cacheManager;
@Bean
public CacheManager cacheManager(Ticker ticker) {
CaffeineCache c1 = new CaffeineCache("my-custom-cache", Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(400)
.build());
// ...
cacheManager.setCaches(Arrays.asList(..., c1, ... )); // here I'd like to add custom caches...
return cacheManager;
}
}
Run Code Online (Sandbox Code Playgroud)
但是声明一个新的CacheManagerbean,“原始”cacheManager不是自动装配的......
有没有办法实现我需要的?
caffeine ×10
java ×5
spring ×5
caching ×4
spring-cache ×4
spring-boot ×3
guava ×1
jcache ×1
kotlin ×1
lru ×1