আমি কি @ ক্যাশেবলের জন্য একটি টিটিএল সেট করতে পারি?


108

আমি @Cacheableস্প্রিং ৩.১-এর জন্য টীকা সমর্থনটি ব্যবহার করে দেখছি এবং ভাবছি যে কোনও সময়ে টিটিএল সেট করে ক্যাশেড ডেটা পরিষ্কার করার কোনও উপায় আছে কিনা? এই মুহুর্তে আমি যা দেখতে পাচ্ছি সেগুলি থেকে নিজেকে ব্যবহার করে এটি পরিষ্কার করে নেওয়া দরকার, এবং এটির @CacheEvictসাথে একত্রে @Scheduledআমি নিজেই টিটিএল বাস্তবায়ন করতে পারি তবে এত সাধারণ কাজের জন্য এটি কিছুটা মনে হয়?

উত্তর:


39

Http://static.springsource.org/spring/docs/3.1.x/spring-framework-references/htmlsingle/spring-framework-references.html#cache-specific-config দেখুন :

আমি কীভাবে টিটিএল / টিটিআই / উচ্ছেদ নীতি / XXX বৈশিষ্ট্য সেট করতে পারি?

সরাসরি আপনার ক্যাশে সরবরাহকারীর মাধ্যমে। ক্যাশে বিমূর্তিটি ... ভাল, একটি বিমূর্ততা ক্যাশে বাস্তবায়ন নয়

সুতরাং, আপনি যদি EHCache ব্যবহার করেন, টিটিএল কনফিগার করতে EHCache এর কনফিগারেশন ব্যবহার করুন।

আপনি ক্যাচ তৈরি করতে পেয়ারার ক্যাশেবিল্ডারও ব্যবহার করতে পারেন এবং এই ক্যাশের কনকন্টারম্যাপ ভিউটি কনকেনারম্যাপচিচিফ্যাক্টরিবিনের সেট স্টোর পদ্ধতিতে পাস করতে পারেন ।


58

বসন্ত 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
স্প্রিং ৪.১-এর জন্য ক্যাচিং কনফিগুরির সমর্থন প্রসারিত করুন এবং কেবল ওভাররাইট ক্যাশে ম্যানেজার ()।
জোহানেস ফ্ল্যাগেল

40

এখানে বসন্তে পেয়ারা ক্যাশে স্থাপনের একটি সম্পূর্ণ উদাহরণ। আমি এহচাকে ওপরে পেয়ারা ব্যবহার করেছি কারণ এটি কিছুটা হালকা ওজন এবং কনফিগারেশনটি আমার কাছে আরও সোজা বলে মনে হয়েছিল।

মাভেন নির্ভরতা আমদানি করুন

আপনার maven pom ফাইলগুলিতে এই নির্ভরতা যুক্ত করুন এবং ক্লিন এবং প্যাকেজগুলি চালান। এই ফাইলগুলি হ'ল ক্যাচবিল্ডার ব্যবহারের জন্য পেয়ারা ডিপ এবং স্প্রিং সহায়ক methods

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

ক্যাশে কনফিগার করুন

জাভা কনফিগারেশন ব্যবহার করে ক্যাশে কনফিগার করতে আপনার ক্যাশে কনফিগ ফাইল তৈরি করতে হবে।

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

আপনি এখানে টীকাযুক্ত স্ক্রিনশটগুলির সাথে আরও একটি সম্পূর্ণ উদাহরণ দেখতে পাচ্ছেন: বসন্তের পেয়ারা ক্যাশে


4
দ্রষ্টব্য: পেয়ারা ক্যাশে এখন বসন্ত 5 এ অবহিত করা হয়েছে ( স্ট্যাকওভারফ্লো.com / জিজ্ঞাসা / 44175085/… )
আমিন

36

আমি লাইফ হ্যাকিং এর মতো ব্যবহার করি

@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কোথাও থেকে পদ্ধতি কল করছেন ? কেমন হচ্ছে ক্যাচ এভিক্ট ??
জয়করত

এটা নাও. আমরা কোথাও থেকে এই পদ্ধতি কল করছি না। এটি ফিক্সডলে সময় ব্যবধানের পরে ডাকা হয়। ইঙ্গিতটির জন্য ধন্যবাদ।
জয়করত

4
একটি শিডিয়ুলে পুরো ক্যাশে সাফ করা জিনিসগুলি কাজ করতে একটি সহজ হ্যাক হতে পারে, তবে এই পদ্ধতিটি আইটিটিএল দেওয়ার জন্য ব্যবহার করা যাবে না। এমনকি শর্তের মানটি কেবলমাত্র পুরো ক্যাশে মুছতে হবে কিনা তা কেবল ঘোষণা করতে পারে। এটি অন্তর্নিহিত সত্য যে কনকন্টের্যাপ্যাপে কোনও টাইমস্ট্যাম্প ছাড়াই অবজেক্টগুলি সঞ্চয় করে, তাই কোনও টিটিএলকে যেমন আছে তেমনি মূল্যায়ন করার উপায় নেই।
জেএমবি

কোডস-অফ-দ্য-প্যান্ট (এই পদ্ধতিটি লিখে দেওয়া হয়েছিল :))।
এটাম

সুন্দর এবং পরিষ্কার পদ্ধতির
লকসাস

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(){
...
}

আশ্চর্য! আমি ঠিক তাই খুঁজছিলাম
মেরিলিটো

7

এটি org.springframework.cache.interceptor.CacheInterceptor এবং "doPut" পদ্ধতি - org.springframework.cache.intercepor- এর ওভাররাইড করে কাজ করা যেতে পারে st (আমার ক্ষেত্রে আমি হ্যাজেলকাস্ট ক্যাশে ম্যানেজার ব্যবহার করি)

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



}

আপনার ক্যাশে কনফিগারেশনে আপনাকে সেই দুটি শিম পদ্ধতি যুক্ত করতে হবে, আপনার কাস্টম ইন্টারসেপ্টর উদাহরণ তৈরি করতে হবে।

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


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

আপনি যখন প্রবেশের স্তরে টিটিএল সেট করতে চান, এবং বিশ্বব্যাপী ক্যাশে স্তরে নয় তখন এই সমাধানটি ভাল


2

বসন্ত-বুট 1.3.3 সাল থেকে, আপনি ব্যবহার দ্বারা CacheManager সময় মেয়াদ শেষ সেট করতে পারেন RedisCacheManager.setExpires বা RedisCacheManager.setDefaultExpiration মধ্যে CacheManagerCustomizer কল-ব্যাক শিম।


1

রেডিস ব্যবহার করার সময়, টিটিএল এই জাতীয় বৈশিষ্ট্য ফাইলে সেট করা যায়:

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

আপনি redis এবং জাভা 8 সঙ্গে কাজ হয়, আপনি কটাক্ষপাত করা করতে পারেন JetCache :

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


4
প্রশ্নটি বসন্তের @ ক্যাশেবল টিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.