@Cacheable에 대한 TTL을 설정할 수 있습니까?
@Cacheable
Spring 3.1에 대한 주석 지원을 시도하고 있으며 TTL을 설정하여 잠시 후 캐시 된 데이터를 지우는 방법이 있는지 궁금합니다. 지금 당장은를 사용하여 직접 정리해야하며 @CacheEvict
함께 사용하여 @Scheduled
TTL 구현을 직접 만들 수 있지만 그렇게 간단한 작업에는 약간 많은 것 같습니다.
http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#cache-specific-config 참조 하십시오 :
TTL / TTI / 퇴거 정책 / XXX 기능은 어떻게 설정하나요?
캐시 공급자를 통해 직접. 캐시 추상화는 ... 음, 추상화는 캐시 구현이 아닙니다.
따라서 EHCache를 사용하는 경우 EHCache의 구성을 사용하여 TTL을 구성하십시오.
Guava의 CacheBuilder 를 사용하여 캐시를 빌드하고이 캐시의 ConcurrentMap 뷰를 ConcurrentMapCacheFactoryBean의 setStore 메소드에 전달할 수도 있습니다.
Spring 3.1 및 Guava 1.13.1 :
@EnableCaching
@Configuration
public class CacheConfiguration implements CachingConfigurer {
@Override
public CacheManager cacheManager() {
ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager() {
@Override
protected Cache createConcurrentMapCache(final String name) {
return new ConcurrentMapCache(name,
CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).maximumSize(100).build().asMap(), false);
}
};
return cacheManager;
}
@Override
public KeyGenerator keyGenerator() {
return new DefaultKeyGenerator();
}
}
다음은 Spring에서 Guava Cache를 설정하는 전체 예제입니다. 나는 Ehcache보다 Guava를 사용했는데 무게가 약간 가볍고 구성이 나에게 더 간단 해 보였습니다.
Maven 종속성 가져 오기
이러한 종속성을 maven pom 파일에 추가하고 clean 및 packages를 실행하십시오. 이 파일은 CacheBuilder에서 사용하기위한 Guava dep 및 Spring 도우미 메서드입니다.
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
캐시 구성
Java 구성을 사용하여 캐시를 구성하려면 CacheConfig 파일을 만들어야합니다.
@Configuration
@EnableCaching
public class CacheConfig {
public final static String CACHE_ONE = "cacheOne";
public final static String CACHE_TWO = "cacheTwo";
@Bean
public Cache cacheOne() {
return new GuavaCache(CACHE_ONE, CacheBuilder.newBuilder()
.expireAfterWrite(60, TimeUnit.MINUTES)
.build());
}
@Bean
public Cache cacheTwo() {
return new GuavaCache(CACHE_TWO, CacheBuilder.newBuilder()
.expireAfterWrite(60, TimeUnit.SECONDS)
.build());
}
}
캐시 할 메소드에 주석 달기
@Cacheable 주석을 추가하고 캐시 이름을 전달하십시오.
@Service
public class CachedService extends WebServiceGatewaySupport implements CachedService {
@Inject
private RestTemplate restTemplate;
@Cacheable(CacheConfig.CACHE_ONE)
public String getCached() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> reqEntity = new HttpEntity<>("url", headers);
ResponseEntity<String> response;
String url = "url";
response = restTemplate.exchange(
url,
HttpMethod.GET, reqEntity, String.class);
return response.getBody();
}
}
You can see a more complete example here with annotated screenshots: Guava Cache in Spring
I use life hacking like this
@Configuration
@EnableCaching
@EnableScheduling
public class CachingConfig {
public static final String GAMES = "GAMES";
@Bean
public CacheManager cacheManager() {
ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager(GAMES);
return cacheManager;
}
@CacheEvict(allEntries = true, value = {GAMES})
@Scheduled(fixedDelay = 10 * 60 * 1000 , initialDelay = 500)
public void reportCacheEvict() {
System.out.println("Flush Cache " + dateFormat.format(new Date()));
}
Springboot 1.3.8
import java.util.concurrent.TimeUnit;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.guava.GuavaCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.google.common.cache.CacheBuilder;
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
@Override
@Bean
public CacheManager cacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager();
return cacheManager;
}
@Bean
public CacheManager timeoutCacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager();
CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterWrite(5, TimeUnit.SECONDS);
cacheManager.setCacheBuilder(cacheBuilder);
return cacheManager;
}
}
and
@Cacheable(value="A", cacheManager="timeoutCacheManager")
public Object getA(){
...
}
this can be done by extending org.springframework.cache.interceptor.CacheInterceptor , and override "doPut" method - org.springframework.cache.interceptor.AbstractCacheInvoker your override logic should use the cache provider put method that knows to set TTL for cache entry (in my case I use HazelcastCacheManager)
@Autowired
@Qualifier(value = "cacheManager")
private CacheManager hazelcastCacheManager;
@Override
protected void doPut(Cache cache, Object key, Object result) {
//super.doPut(cache, key, result);
HazelcastCacheManager hazelcastCacheManager = (HazelcastCacheManager) this.hazelcastCacheManager;
HazelcastInstance hazelcastInstance = hazelcastCacheManager.getHazelcastInstance();
IMap<Object, Object> map = hazelcastInstance.getMap("CacheName");
//set time to leave 18000 secondes
map.put(key, result, 18000, TimeUnit.SECONDS);
}
on your cache configuration you need to add those 2 bean methods , creating your custom interceptor instance .
@Bean
public CacheOperationSource cacheOperationSource() {
return new AnnotationCacheOperationSource();
}
@Primary
@Bean
public CacheInterceptor cacheInterceptor() {
CacheInterceptor interceptor = new MyCustomCacheInterceptor();
interceptor.setCacheOperationSources(cacheOperationSource());
return interceptor;
}
This solution is good when you want to set the TTL on the entry level , and not globally on cache level
Since Spring-boot 1.3.3, you may set expire time in CacheManager by using RedisCacheManager.setExpires or RedisCacheManager.setDefaultExpiration in CacheManagerCustomizer call-back bean.
If you are working with redis and Java 8, you can take a look at JetCache:
@Cached(expire = 10, timeUnit = TimeUnit.MINUTES) User getUserById(long userId);
참고URL : https://stackoverflow.com/questions/8181768/can-i-set-a-ttl-for-cacheable
'Programing' 카테고리의 다른 글
Android singleTask 또는 singleInstance 시작 모드? (0) | 2020.09.18 |
---|---|
tf.exe (TFS 명령 줄 클라이언트)를 얻는 방법은 무엇입니까? (0) | 2020.09.18 |
? attr / selectableItemBackground를 배경으로 사용할 때 잔물결 색상을 어떻게 수정할 수 있습니까? (0) | 2020.09.18 |
unix : /var/run/docker.sock에서 Docker 데몬에 연결할 수 없습니다. (0) | 2020.09.18 |
Android 레이아웃 가중치 (0) | 2020.09.17 |