/ / Google अमरूद कैशबिल्डर एक्सिपायर के बाद के समय का अधिक से अधिक उपयोग करें। असफल और समाप्ति के बाद।

google guava cachebuilder exipreAfterAccess और expireActerWrite - जावा, संग्रह, अमरूद, concurrenthashmap के बीच अधिक समय का उपयोग करें

अगर मैं पहली बार एक प्रश्न पोस्ट कर रहा हूं, तो सबसे पहले मैं अपोलोजिज करता हूं, क्योंकि मैं किसी भी नियम और नियम का पालन नहीं करता हूं।

मैं ऐसी स्थिति में हूं, जहां मुझे प्रयोग करने की आवश्यकता हैनक्शा जहां मानचित्र से तत्व निश्चित समय के बाद स्वचालित रूप से हटाए जा सकते हैं। मुझे खुशी है कि मैं Google अमरूद से कैशबिल्डर का उपयोग कर सकता हूं। मुझे एक डिफ़ॉल्ट समय सीमा निर्दिष्ट करने की आवश्यकता है जो मैं expireAfterWrite (..) का उपयोग करके कर सकता हूं लेकिन मुझे अपनी पहुंच के बाद इसे ओवरराइड करने की आवश्यकता है। मैं exipreAfterAccess (..) का उपयोग कर सकता हूं, लेकिन यह अभी भी exipreAfterWrite (..) द्वारा निर्धारित प्रारंभिक समय के बाद इसे हटा देता है

मैं इस कार्यक्षमता को कैसे प्राप्त कर सकता हूं ताकि निष्कासन के मापदंड समय से अधिक समय के लिए निष्कासन की जाँच करें। असफल और समाप्ति के बाद।

इस मामले की तलाश के लिए धन्यवाद

उत्तर:

जवाब के लिए 2 № 1

मैं बस सेटिंग न करने की सलाह दूंगा expireAfterWrite मूल्य। यह वही हासिल करेगा जो आप चाहते हैं।

नीचे छोटा उदाहरण देखें।

  1. यह सबसे पहले आपकी वर्तमान स्थिति को दिखाता है (expireAfterWrite = 1 सेकंड, expireAfterAccess = 2 सेकंड) -> हर सेकंड, मान पुनः लोड किया जाता है
  2. यह तब केवल एक कैश बनाता है (समाप्ति के बाद = 2 सेकंड) और इसे हर 100ms तक पहुँचाता है -> मान केवल एक बार घटता है
  3. यह तब 2 सेकंड के लिए सोता है -> मूल्य ठीक से पुनः लोड किया जाता है।

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

import com.google.common.base.Stopwatch;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

public class TestCache {

private static final String KEY = "Key";

public static void main(String[] args) throws ExecutionException, InterruptedException {
CacheLoader<String, String> loader = new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
System.out.println("Loading key");
return key;
}
};
LoadingCache<String, String> cache1 = CacheBuilder.newBuilder().expireAfterAccess(2L, TimeUnit.SECONDS)
.expireAfterWrite(1L, TimeUnit.SECONDS).build(loader);
cache1.get(KEY); // First write
testCache(cache1);
LoadingCache<String, String> cache2 = CacheBuilder.newBuilder().expireAfterAccess(2L, TimeUnit.SECONDS).build(loader);
testCache(cache2);
System.out.println("Final test on cache 2");
Thread.sleep(2001);
System.out.println(cache2.get(KEY));

}

private static void testCache(LoadingCache<String, String> cache1) throws ExecutionException, InterruptedException {
Stopwatch sw = Stopwatch.createStarted();
while (sw.elapsed(TimeUnit.SECONDS) < 5) {
System.out.println(sw.elapsed(TimeUnit.MILLISECONDS) + " " + cache1.get(KEY));
Thread.sleep(100);
}
}
}