2011-11-18 21 views
53

Tôi đang thử hỗ trợ chú thích @Cacheable cho Spring 3.1 và tự hỏi liệu có cách nào để làm cho dữ liệu được lưu trong bộ nhớ cache bị xóa sau một thời gian bằng cách đặt TTL không? Ngay bây giờ từ những gì tôi có thể thấy tôi cần phải tự mình xóa nó bằng cách sử dụng @CacheEvict, và bằng cách sử dụng cùng với @Scheduled Tôi có thể tự thực hiện TTL nhưng có vẻ như một chút cho một nhiệm vụ đơn giản như vậy?Tôi có thể đặt TTL cho @Cacheable

Trả lời

24

Xem http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#cache-specific-config:

Làm thế nào tôi có thể thiết lập các chính sách TTL/TTI/Đuổi/Tính năng XXX?

Trực tiếp thông qua nhà cung cấp bộ nhớ cache của bạn. Trừu tượng bộ nhớ cache là ... tốt, một sự trừu tượng không phải là một thực hiện bộ nhớ cache

Vì vậy, nếu bạn sử dụng EHCache, sử dụng cấu hình EHCache để cấu hình TTL.

Bạn cũng có thể sử dụng số CacheBuilder của Guava để tạo bộ nhớ cache và chuyển giao chế độ xem Bản đồ đồng thời của bộ nhớ cache này cho setStore method of the ConcurrentMapCacheFactoryBean.

27

Xuân 3.1 và Ổi 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(); 
    } 

} 
+5

Đối với mùa xuân 4.1 mở rộng CachingConfigurerSupport và chỉ ghi đè lên cacheManager(). –

23

Dưới đây là một ví dụ đầy đủ các thiết lập Ổi Cache trong mùa xuân. Tôi đã sử dụng ổi trên Ehcache vì nó nhẹ hơn một chút và cấu hình có vẻ thẳng hơn với tôi.

nhập Maven Dependencies

Thêm những phụ thuộc vào tập tin pom maven của bạn và chạy sạch và gói. Các tệp này là các phương thức trợ giúp Guava và Spring để sử dụng trong CacheBuilder.

<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> 

Configure Cache

Bạn cần phải tạo một tập tin CacheConfig để cấu hình bộ nhớ cache sử dụng Java config.

@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()); 
    } 
} 

Chú thích phương pháp này để được lưu trữ

Thêm chú thích @Cacheable và vượt qua trong tên bộ nhớ cache.

@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(); 
    } 
} 

Bạn có thể thấy một ví dụ hoàn chỉnh hơn ở đây với ảnh chụp màn hình và chú thích: Guava Cache in Spring

15

tôi sử dụng cuộc sống hack như thế này

@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())); 
} 
+0

Bạn có đang gọi phương thức 'reportCacheEvict' từ bất kỳ đâu. Làm thế nào cacheEvict xảy ra ?? – Jaikrat

+0

Tải xuống. Chúng tôi không gọi phương thức này từ bất kỳ đâu. Nó được gọi sau khoảng thời gian fixedDelay. Cảm ơn gợi ý. – Jaikrat

+0

Xóa toàn bộ bộ nhớ cache trên lịch biểu có thể là một hack hữu ích để có được những thứ làm việc, nhưng phương pháp này không thể được sử dụng để cung cấp cho các mục một TTL. Ngay cả giá trị * condition * chỉ có thể tuyên bố có xóa toàn bộ bộ nhớ cache hay không. Dưới đây là một thực tế là ConcurrentMapCache lưu trữ các đối tượng mà không có bất kỳ dấu thời gian, vì vậy không có cách nào để đánh giá một TTL như là. – jmb

1

Kể từ mùa xuân-boot 1.3.3, bạn có thể thiết lập thời gian hết hạn trong CacheManager bằng cách sử dụng RedisCacheManager.setExpires hoặc RedisCacheManager.setDefaultExpiration trong CacheManagerCustomizer bean gọi lại.

13

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; 
} 

} 

@Cacheable(value="A", cacheManager="timeoutCacheManager") 
public Object getA(){ 
... 
} 
+0

Tuyệt vời! Đây chính xác là những gì tôi đang tìm kiếm – MerLito

2

này có thể được thực hiện bằng cách mở rộng org.springframework.cache.interceptor.CacheInterceptor, và ghi đè "doPut" phương pháp - org.springframework.cache.interceptor.AbstractCacheInvoker của bạn ghi đè lên logic nên sử dụng các nhà cung cấp bộ nhớ cache đặt phương pháp mà biết để thiết lập TTL cho mục nhập bộ nhớ cache (trong trường hợp của tôi tôi sử dụng 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); 



} 

trên các bạn cấu hình, bạn cần thêm 2 phương thức bean đó, tạo cá thể đánh chặn tùy chỉnh của bạn.

@Bean 
public CacheOperationSource cacheOperationSource() { 
    return new AnnotationCacheOperationSource(); 
} 


@Primary 
@Bean 
public CacheInterceptor cacheInterceptor() { 
    CacheInterceptor interceptor = new MyCustomCacheInterceptor(); 
    interceptor.setCacheOperationSources(cacheOperationSource());  
    return interceptor; 
} 

Giải pháp này là tốt khi bạn muốn thiết lập TTL trên cấp nhập cảnh, và không toàn cầu về mức độ bộ nhớ cache

Các vấn đề liên quan