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
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.
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();
}
}
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
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()));
}
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
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
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
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.
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;
}
}
và
@Cacheable(value="A", cacheManager="timeoutCacheManager")
public Object getA(){
...
}
Tuyệt vời! Đây chính xác là những gì tôi đang tìm kiếm – MerLito
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
- 1. Có TTL cho MySQL như có trong MongoDB không?
- 2. spring 3.1 @Cacheable example
- 3. Plugin plugin cache-ehcache và giá trị TTL
- 4. Redis Multi-Set Với TTL
- 5. TTL 0 trong CloudFront hữu ích cho mục đích gì?
- 6. TTL cho một thành viên được thiết lập
- 7. Tôi có thể đặt umask cho tempfile.NamedTemporaryFile bằng python không?
- 8. Danh sách C# trong đó các mục có TTL
- 9. Kiểm tra hàng TTL trong cassandra?
- 10. Chú thích @Cacheable của Spring có thể có cùng phạm vi với bean của phương thức được chú thích không?
- 11. Tôi có thể đặt thời gian mặc định cụ thể cho trường datetime Django không?
- 12. Làm cách nào tôi có thể đặt CSS chỉ cho các trình duyệt IE cụ thể?
- 13. Làm cách nào tôi có thể đặt đúng DJANGO_SETTINGS_MODULE cho dự án Django của tôi (Tôi đang sử dụng virtualenv)?
- 14. Làm thế nào tôi có thể đặt ApplicationController trong Ember.Router
- 15. Làm thế nào để làm cho tài liệu eltearch ttl hoạt động?
- 16. Tôi có thể đặt thuộc tính `thuộc tính` của` UILabel`
- 17. Tôi có thể cài đặt nhiều phiên bản Xcode không?
- 18. Trong emacs, tôi có thể có một bộ cài đặt dòng bọc cho mã và một cho văn bản không?
- 19. Làm cách nào để tôi có thể đặt WAMP trực tuyến cho ai đó truy cập?
- 20. Tôi có thể đặt không gian bảng mặc định cho Chỉ mục và Bảng không?
- 21. Tôi có thể đặt Subversion + TortoiseSVN không phân biệt chữ hoa chữ thường cho Windows không?
- 22. Tôi có thể đặt giản đồ mặc định cho một thủ tục được lưu trữ không?
- 23. Tôi có thể đặt thời gian chờ cho UdpClient trong C# không?
- 24. Capistrano: Tôi có thể đặt biến môi trường cho toàn bộ phiên làm việc không?
- 25. Có thể cài đặt/truy cập SSL cho ứng dụng Google App Engine của tôi không?
- 26. Làm cách nào tôi có thể đặt lược đồ cho đối tượng URI trong Ruby
- 27. Làm cách nào tôi có thể đặt đối số mặc định cho "ls" trong Linux?
- 28. Làm cách nào tôi có thể đặt lược đồ hiện tại cho DB2 bằng Hibernate/JDBC?
- 29. Android: Làm cách nào tôi có thể đặt trình nghe cho MenuButton?
- 30. Tôi có thể đặt một thư mục dữ liệu khác cho Internet Explorer không?
Đối với mùa xuân 4.1 mở rộng CachingConfigurerSupport và chỉ ghi đè lên cacheManager(). –