我是靠谱客的博主 高高裙子,最近开发中收集的这篇文章主要介绍Caffeine使用篇 - Eviction前言一、基于大小二、基于时间三、基于引用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 前言
  • 一、基于大小
  • 二、基于时间
  • 三、基于引用


前言

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前言一、基于大小二、基于时间三、基于引用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部