目录
2.3 加权器weigher和最大加权值maximumWeight
2.4 写后超时expireAfterWrite和读后超时expireAfterRead
这篇文章主要分析Guava Cache的核心参数,对Guava Cache感兴趣的同学,可以结合另一篇整体分析Guava Cache原理的文章来了解Guava Cache:Guava Cache:原理详解
1、核心参数概览
2、核心参数分功能分析
2.1 初始容量initialCapacity
1、主要作用:
initialCapacity表示初始容量,在缓存创建的过程中进行设置。注意事项:
- 不可重复设置:初始容量只能设置一次有效值,否则会抛出异常;
- 最小值限制:初始容量应该大于等于0,否则会抛出异常;
- 最大值限制:initialCapacity会从2的30次方、maximumWeight、CacheBuilder的传入值中取最小值;
- 并发性相关:initialCapacity最好设置成段数segmentCount(segmentCount的计算参加:? )的整数倍,因为initialCapacity用来设置段的初始容量segmentCapacity,segmentCapacity取值即initialCapacity除以segmentCount并向上取整。
2、核心代码:
1)CacheBuilder中设置初始容量的代码:
public CacheBuilder<K, V> initialCapacity(int initialCapacity) {
checkState(
this.initialCapacity == UNSET_INT,
"initial capacity was already set to %s",
this.initialCapacity);
checkArgument(initialCapacity >= 0);
this.initialCapacity = initialCapacity;
return this;
}
2)LocalCache构造器中initialCapacity取值:
int initialCapacity = Math.min(builder.getInitialCapacity(), MAXIMUM_CAPACITY);
if (evictsBySize() && !customWeigher()) {
initialCapacity = (int) Math.min(initialCapacity, maxWeight);
}
3)LocalCache构造器中initialCapacity用来计算段的初始容量:
int segmentCapacity = initialCapacity / segmentCount;
if (segmentCapacity * segmentCount < initialCapacity) {
++segmentCapacity;
}
2.2 最大容量maximumSize
1、主要作用:
用来形容缓存的最大容量,以避免缓存过多导致内存泄露。注意事项:
- 实质:maximumSize主要是用来设置maxWeight,在缓存内部是通过maxWeight来限制缓存容量的;
- 不可重复设置:最大容量只能设置一次有效值,否则会抛出异常;最大容量和最大权重maxWeight只允许设置一个,否则会抛出异常;
和最大权重对比:
- 相同性:在缓存没有特殊加权计算的情况下,两者等价,只需设置任意即可;
- 差异性1:有特殊加权值计算(指定weigher)的场景,必须也只能使用最大权重maximumWeight;
- 差异性2:在没有特殊加权值计算(指定weigher)的场景,必须也只能使用最大大小maximumSize;
- 差异性3:在缓存实例内部,成员变量使用的是最大权重maximumWeight,maximumSize会通过转化成maxWeight来生效。
2、核心代码:
1)CacheBuilder中设置最大容量的代码:
public CacheBuilder<K, V> maximumSize(long maximumSize) {
checkState(
this.maximumSize == UNSET_INT, "maximum size was already set to %s", this.maximumSize);
checkState(
this.maximumWeight == UNSET_INT,
"maximum weight was already set to %s",
this.maximumWeight);
checkState(this.weigher == null, "maximum size can not be combined with weigher");
checkArgument(maximumSize >= 0, "maximum size must not be negative");
this.maximumSize = maximumSize;
return this;
}
2)获取最大加权值:maximumSize和maximumWeight是否生效取决于是否指定了weigher
long getMaximumWeight() {
if (expireAfterWriteNanos == 0 || expireAfterAccessNanos == 0) {
return 0;
}
return (weigher == null) ? maximumSize : maximumWeight;
}
2.3 加权器weigher和最大加权值maximumWeight
1、加权的主要作用:
加权器weigher主要用来根据缓存的key-value来设置不同的加权值。加权值表示占据的内存的基本单元数据的多少。注意事项:
- 缺省值:CacheBuilder中可以不设置weigher,此时weigher为null;构造缓存LocalCache实例时,如果weigher为null则使用OneWeigher.INSTANCE;
- 和最大容量参数的关系:指定weigher时,最大容量只能使用maximumWeight;不指定weigher时,最大容量只能使用maximumSize;
- 自定义方式:实现weigher接口
2、最大加权值的作用:
最大加权值,在CacheBuilder中使用字段名maximumWeight,在LocalCache中使用字段名maxWeight,用来描述缓存的最大容量。注意事项:
- 使用场景:只有在设置了weigher的时候,才会使用maximumWeight;否则使用maximumSize;
- 内部机制:在缓存LocalCache的内部,使用的是maxWeight;如果没有指定weighter,会将CacheBuilder中的maximumSize读取为maxWeight;
- 生效方式:对每个分段计算一个最大分段加权值;
- 缺省值:-1,此时不会限制缓存容量;-1无法显示设置,不设置即为-1. </