如何在特定时间缓存数据Spring Boot Rest模板

时间:2018-12-20 16:46:42

标签: java spring spring-mvc caching

我正在尝试找到一种在特定时间段内缓存某些数据的方法。

我知道@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时间(作为参数传递的时间戳记)来缓存数据,例如,如果已经过去了一个小时,则缓存应该无效。

1 个答案:

答案 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")批注添加到要缓存结果的方法中