我正在尝试找到一种在特定时间段内缓存某些数据的方法。
我知道@Cachable
批注,但是在任何特定时间段之后,我都找不到任何清除缓存的方法。
@GetMapping("/{lang}.{format}")
@Timed
public ResponseEntity<Object> getLocalizedMessages(@PathVariable String lang,
@PathVariable String format,
@RequestParam("buildTimestamp") long buildTimestamp) throws InvalidArgumentException {
Map<String, Object> messages = this.localeMessageService.getMessagesForLocale(lang);
if (FORMAT_JSON.equals(format)) {
String jsonMessages = new PropertiesToJsonConverter().convertFromValuesAsObjectMap(messages);
return new ResponseEntity<>(jsonMessages, HttpStatus.OK);
}
return new ResponseEntity<>(messages, HttpStatus.OK);
}
这是我的rest方法,我需要基于unix时间(作为参数传递的时间戳记)来缓存数据,例如,如果已经过去了一个小时,则缓存应该无效。
答案 0 :(得分:1)
Spring缓存抽象不提供缓存存储。必须设置CacheManager才能设置实际存储。
这是一个使用Guava的实现示例,该示例支持基于时间的驱逐:
添加番石榴依赖项
行家:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0-jre</version>
</dependency>
等级:
compile 'com.google.guava:guava:27.0-jre'
添加一个类来配置缓存
import com.google.common.cache.CacheBuilder;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.cache.interceptor.SimpleKeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager() {
@Override
protected Cache createConcurrentMapCache(final String name) {
return new ConcurrentMapCache(name, CacheBuilder.newBuilder()
// You can customize here the eviction time
.expireAfterWrite(1, TimeUnit.HOURS)
.build()
.asMap(),
false);
}
};
}
@Bean
public KeyGenerator keyGenerator() {
return new SimpleKeyGenerator();
}
}
最后,将@Cacheable("CacheName")
批注添加到要缓存结果的方法中