Config Spring cache using Guava
Solution 1
You can configure caches separately. See Spring Guava cache
@Bean
public CacheManager cacheManager() {
SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
GuavaCache bookCache = new GuavaCache("book", CacheBuilder.newBuilder().build());
GuavaCache booksExpirableCache = new GuavaCache("books", CacheBuilder.newBuilder()
.expireAfterAccess(30, TimeUnit.MINUTES)
.build());
simpleCacheManager.setCaches(Arrays.asList(bookCache, booksExpirableCache));
return simpleCacheManager;
}
Solution 2
You can specify CacheBuilder for your GuavaCacheManager in your Spring configuration
- In case of Java configuration it can look like this:
@Bean
public CacheManager cacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager();
cacheManager.setCacheBuilder(
CacheBuilder.
newBuilder().
expireAfterWrite(2, TimeUnit.SECONDS).
maximumSize(100));
return cacheManager;
}
- In case of XML configuration, you can use CacheBuilderSpec in guava
<bean id="legendaryCacheBuilder"
class="com.google.common.cache.CacheBuilder"
factory-method="from">
<constructor-arg value="maximumSize=42,expireAfterAccess=10m,expireAfterWrite=1h" />
</bean>
For more information look at:
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilderSpec.html
Injecting Google guava cache builder into bean via Spring
Solution 3
In another way
XML
<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager">
<property name="cacheBuilderSpec">
<bean class="com.google.common.cache.CacheBuilderSpec" factory-method="parse">
<constructor-arg name="cacheBuilderSpecification" value="expireAfterWrite=55m"/>
</bean>
</property>
</bean>
Java
@Cacheable(value = "tokenValue", cacheManager = "cacheManager")
Solution 4
I think that @mavarazy answer is the best. I only add if you need you own automatic missed cache configuration you could do it on the following way.
First define you own cache manager which creates automatically cache if you need it:
public class MyCacheManager extends SimpleCacheManager {
@Override
protected Cache getMissingCache(String name) {
// or different cache config if you need
return new GuavaCache(name, CacheBuilder.newBuilder().maximumSize(250).expireAfterWrite(10, TimeUnit.MINUTES).build());
}
}
And now you can define cache manager configuration:
@Bean
public CacheManager cacheManager() {
SimpleCacheManager simpleCacheManager = new MyCacheManager();
GuavaCache specificCacheConfig = new GuavaCache("specificCacheConfigName",
CacheBuilder.newBuilder().expireAfterAccess(60, TimeUnit.MINUTES).build());
simpleCacheManager.setCaches(Collections.singletonList(specificCacheConfig));
return simpleCacheManager;
}
Related videos on Youtube
xedo
Updated on July 09, 2022Comments
-
xedo almost 2 years
Following the spring documentation about cache I could use cache on my project, but how can I configure guava to define a expired time or size per cache name?
applicationConfig.xml
<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager"/>
Foo.java
@Cacheable(value="courses", key="#user.id") public List<Course> getCoursesByUser(User user) { ... }
-
xedo over 9 yearsthis is a global configuration, is it possible set it by cache name?
-
mavarazy over 9 yearsI'm not sure what you mean by global configurations, you can make them as local as you want :)
-
xedo about 9 yearsfor instance the cache value
courses
expires on 10min but the valuefoo
expire on 5h -
mavarazy about 9 yearsIf you want to expire based on keys, I'm not aware of such functionality in guava. If you want to have few Guava caches in running system, it's another thing - take a look at java.dzone.com/articles/spring-caching-abstraction-and
-
skelly almost 9 yearsYou could make a separate cacheManager with a different cacheBuilder that has a different configuration. Then specify
@Cacheable(value="courses", cacheManager="shortTTLCacheManager")
and@Cacheable(value="foo", cacheManager="longTTLCacheManager")
-
Paramesh Korrakuti almost 9 yearsCan some suggest how to use
CacheBuilderSpec
instead of hard codingexpireAfterWrite(2, TimeUnit.SECONDS)
. Gone through speck and propertyexpireAfterWrite=2s
, but not sure, how to use the same in this context.