क्या मैं @ संग्रहण के लिए TTL सेट कर सकता / सकती हूं


102

मैं @Cacheableस्प्रिंग 3.1 के लिए एनोटेशन समर्थन की कोशिश कर रहा हूं और सोच रहा हूं कि क्या टीटीएल सेट करके एक समय के बाद कैश्ड डेटा को स्पष्ट करने का कोई तरीका है? अभी जो मैं देख सकता हूं, उसे उपयोग करके मुझे खुद को खाली करने की आवश्यकता है @CacheEvict, और इसका उपयोग करके @Scheduledमैं खुद टीटीएल कार्यान्वयन कर सकता हूं, लेकिन इस तरह के एक सरल कार्य के लिए यह थोड़ा सा लगता है?

जवाबों:


39

Http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#cache-specific-config देखें :

मैं TTL / TTI / एविक्शन पॉलिसी / XXX सुविधा कैसे सेट कर सकता हूं?

सीधे अपने कैश प्रदाता के माध्यम से। कैश अमूर्त है ... ठीक है, एक अमूर्त एक कैश कार्यान्वयन नहीं है

इसलिए, यदि आप EHCache का उपयोग करते हैं, तो TTL को कॉन्फ़िगर करने के लिए EHCache के कॉन्फ़िगरेशन का उपयोग करें।

कैशे बनाने के लिए आप अमरूद के कैशबैक का भी इस्तेमाल कर सकते हैं , और इस कैशे का समवर्ती नक्शा व्यू को समवर्तीमहिलायोजनाफैक्टरीबिनट के सेटस्टोर विधि में पास कर सकते हैं


57

स्प्रिंग 3.1 और अमरूद 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();
    }

}

21
स्प्रिंग 4.1 के लिए CachingConfigurerSupport और केवल cacheManager को ओवरराइट करें ()।
जोहान्स फ्लगेल

39

यहाँ वसंत में अमरूद कैश स्थापित करने का एक पूरा उदाहरण है। मैंने इवाचे के ऊपर अमरूद का इस्तेमाल किया क्योंकि यह थोड़ा हल्का वजन है और विन्यास मेरे लिए अधिक सीधे लगता है।

आयात मावेन निर्भरताएँ

अपनी मावेन पोम फ़ाइल में इन निर्भरताओं को जोड़ें और स्वच्छ और पैकेज चलाएं। ये फाइलें 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>

कैश को कॉन्फ़िगर करें

आपको जावा कॉन्फ़िगर का उपयोग करके कैश को कॉन्फ़िगर करने के लिए 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());
   }
}

कैश की जाने वाली विधि का उल्लेख करें

@ कैश करने योग्य एनोटेशन जोड़ें और कैश नाम में पास करें।

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

आप एनोटेट स्क्रीनशॉट के साथ यहां एक और पूर्ण उदाहरण देख सकते हैं: स्प्रिंग में अमरूद कैश


2
नोट: अमरूद कैश अब वसंत 5 (में हटाई गई है stackoverflow.com/questions/44175085/... )
अमीन Ziaei

33

मैं इस तरह से लाइफ हैकिंग का इस्तेमाल करता हूं

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

क्या आप reportCacheEvictकहीं से भी फोन कर रहे हैं । कैसे हो रहा कैशबैक ??
जयकरत

उसे ले लो। हम इस पद्धति को कहीं से भी नहीं बुला रहे हैं। फिक्स्डेल टाइम अंतराल के बाद इसका आह्वान किया गया। संकेत के लिए धन्यवाद।
जयकरत

1
शेड्यूल पर पूरे कैश को क्लीयर करना काम करने के लिए एक आसान हैक हो सकता है, लेकिन इस विधि का उपयोग आइटम को टीटीएल देने के लिए नहीं किया जा सकता है। यहां तक ​​कि शर्त मूल्य केवल यह घोषित कर सकता है कि पूरे कैश को हटाना है या नहीं। इस तथ्य को रेखांकित करते हुए कि समवर्तीMapache वस्तुओं को बिना किसी टाइमस्टैम्प के संग्रहीत करता है, इसलिए टीटीएल का मूल्यांकन करने का कोई तरीका नहीं है।
शाम

कोड सीट-ऑफ-द-पैंट है (यह विधि नीचे लिखी गई थी :))।
Atum

अच्छा और साफ दृष्टिकोण
lauksas

31

स्प्रिंगबूट 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(){
...
}

गजब का! यह वही था जो मैं देख रहा था
MerLito

6

यह org.springframework.cache.interceptor.CacheInterceptor, और "doPut" विधि को ओवरराइड करके किया जा सकता है। (मेरे मामले में मैं हेज़ेलकास्टचेचेमैन का उपयोग करता हूं)

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



}

अपने कैश कॉन्फ़िगरेशन पर आपको उन 2 बीन विधियों को जोड़ने की आवश्यकता है, जो आपके कस्टम इंटरसेप्टर का उदाहरण बना रहे हैं।

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


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

जब आप प्रवेश स्तर पर TTL सेट करना चाहते हैं तो यह समाधान अच्छा है, न कि कैश स्तर पर



0

Redis का उपयोग करते समय, TTL को गुण फ़ाइल में इस तरह सेट किया जा सकता है:

spring.cache.redis.time-to-live=1d # 1 day

spring.cache.redis.time-to-live=5m # 5 minutes

spring.cache.redis.time-to-live=10s # 10 seconds


-2

यदि आप रेडिस और जावा 8 के साथ काम कर रहे हैं, तो आप JetCache पर एक नज़र डाल सकते हैं :

@Cached(expire = 10, timeUnit = TimeUnit.MINUTES) User getUserById(long userId);


1
प्रश्न वसंत के लिए है @ परिवर्तनीय एनोटेशन
satyesht
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.