google guava cachebuilder 在 exipreAfterAccess 和 expireActerWrite 之间使用更多的时间
google guava cachebuilder use greater of the time between exipreAfterAccess and expireActerWrite
首先,如果我第一次发布问题时没有遵守 Whosebug 的任何规则和规定,我深表歉意。
我处于需要使用可过期地图的情况,地图中的元素可以在一定时间后自动删除。我很高兴我可以使用 google guava 的 cachebuilder。我需要指定一个默认时间限制,我可以使用 expireAfterWrite(..) 来完成,但我需要在访问后覆盖它。我可以使用 exipreAfterAccess(..) 但它仍然会在 exipreAfterWrite(..) 设置的初始时间后删除它
我怎样才能实现这个功能,以便删除标准检查 exipreAfterAccess 和 expireActerWrite 之间的较长时间
感谢您调查此问题
我只是建议不要设置 expireAfterWrite
值。这将完全实现您想要的。
请参阅下面的小示例。
- 它首先说明了你的当前情况(expireAfterWrite=1 秒,expireAfterAccess=2 秒)--> 每一秒,值都会重新加载
- 然后创建一个只有(expireAfterAccess=2秒)的缓存,每100ms访问一次-->值只加载一次
- 然后休眠 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);
}
}
}
首先,如果我第一次发布问题时没有遵守 Whosebug 的任何规则和规定,我深表歉意。
我处于需要使用可过期地图的情况,地图中的元素可以在一定时间后自动删除。我很高兴我可以使用 google guava 的 cachebuilder。我需要指定一个默认时间限制,我可以使用 expireAfterWrite(..) 来完成,但我需要在访问后覆盖它。我可以使用 exipreAfterAccess(..) 但它仍然会在 exipreAfterWrite(..) 设置的初始时间后删除它
我怎样才能实现这个功能,以便删除标准检查 exipreAfterAccess 和 expireActerWrite 之间的较长时间
感谢您调查此问题
我只是建议不要设置 expireAfterWrite
值。这将完全实现您想要的。
请参阅下面的小示例。
- 它首先说明了你的当前情况(expireAfterWrite=1 秒,expireAfterAccess=2 秒)--> 每一秒,值都会重新加载
- 然后创建一个只有(expireAfterAccess=2秒)的缓存,每100ms访问一次-->值只加载一次
- 然后休眠 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);
}
}
}