概述
文章目录
- 前言
- 一、基于大小
- 二、基于时间
- 三、基于引用
前言
Caffeine提供了三种驱逐策略 - 基于大小、基于时间、基于引用。
一、基于大小
使用固定大小的容量maximumSize或者maximumWeight,一旦超出将基于recently or very often(最近最少)策略,驱逐元素。
1. maximumSize
要求maximumSize与maximumWeight只能设置一个。此外,maximumSize必须大于0。
e.g.
Cache<Object, Object> cache = Caffeine.newBuilder()
.maximumSize(10)
.build();
List<Object> list = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
cache.put(i, i);
list.add(i);
}
Map<Object, Object> map = cache.getAllPresent(list);
map.forEach((k, v) -> {
System.out.println(k + ":" + v);
})
System.out.println(cache.estimatedSize());
2. maximumWeight
要求maximumSize与maximumWeight只能设置一个。此外,maximumWeight必须大于0。
要求一个Caffeine实例只设置一个weigher(…)方法,maximumWeight必须设置。
e.g.
Cache<Object, Object> cache = Caffeine.newBuilder()
.maximumWeight(10)
.weigher(new Weigher<Object, Object>() {
@Override
public @NonNegative int weigh(@NonNull Object key, @NonNull Object value) {
if (value instanceof Integer) {
Integer v = (Integer) value;
return v;
}
return 0;
}
})
.build();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
cache.put(i, i);
list.add(i);
}
Map<Object, Object> map = cache.getAllPresent(list);
map.forEach((k, v) -> {
System.out.println(k + ":" + v);
});
System.out.println(cache.estimatedSize());
二、基于时间
1. expireAfterAccess
在创建、更新、读取之后的一段时间剔除。
Cache.asMap().get(Object)、Cache.asMap().put(K, V)等方法会触发访问时间重置,但是Cache.asMap()方法不会。
e.g.
public class FakeTicker implements Ticker {
private final AtomicLong nanos = new AtomicLong();
public FakeTicker advance(long time, TimeUnit unit) {
this.nanos.getAndAdd(unit.toNanos(time));
return this;
}
// Returns the number of nanoseconds elapsed since this ticker's
// fixed point of reference.
@Override
public long read() {
return this.nanos.get();
}
}
FakeTicker ticker = new FakeTicker();
Cache<Object, Object> cache = Caffeine.newBuilder()
.ticker(ticker)
.expireAfterAccess(Duration.ofSeconds(5))
.build();
cache.put("hello", "world");
System.out.println(cache.getIfPresent("hello"));
fakeTicker.advance(5, TimeUnit.SECONDS);
System.out.println(cache.getIfPresent("hello"));
System.out.println(cache.estimatedSize());
2. expireAfterWrite
在创建、更新之后的一段时间剔除。
3. expireAfter
Expiry
可以返回Long.MAX_VALUE,表示不剔除的语义。
三、基于引用
最后
以上就是高高裙子为你收集整理的Caffeine使用篇 - Eviction前言一、基于大小二、基于时间三、基于引用的全部内容,希望文章能够帮你解决Caffeine使用篇 - Eviction前言一、基于大小二、基于时间三、基于引用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复