CacheBuilder作为LoadingCache 与 Cache实例的创建者,具有以下特征:
1、自动载入键值至缓存;
2、当缓存器溢出时,采用最近最少使用原则进行替换。
3、过期规则可基于最后读写时间。
4、设置键值引用级别。
5、元素移出通知。
6、缓存访问统计。
示例:
LoadingCache<String, Integer> cache = CacheBuilder.newBuilder()
.maximumSize(10)
.expireAfterWrite(10, TimeUnit.SECONDS)
.build(
new CacheLoader<String, Integer>() {
public Integer load(String key) throws Exception {
return loadKey(key);
}
});
例子中设定了缓存大小为10,写后10秒过期,命中失败时会通过load方法将查询键值加入缓存。
缓存的移出策略主要有以下几种:
1)基于缓存权重
LoadingCache<String, Integer> loadingCache = CacheBuilder.newBuilder()
.maximumWeight(10)
.weigher(new Weigher<String, Integer>() {
public int weigh(String k, Integer v) {
return v; //v的权重设为其本身;
}
})
.recordStats()
.build(
new CacheLoader<String, Integer>() {
public Integer load(String key) {
return num++; //num初始值为1;
}
});
System.out.println(loadingCache.get("a"));
System.out.println(loadingCache.get("b"));
System.out.println(loadingCache.get("c"));
System.out.println(loadingCache.get("d"));
System.out.println(loadingCache.get("a"));
输出结果为1 2 3 4 1,当设置为maximumWeight(9)时,输出结果即为1 2 3 4 5,因为在get("d")时,权重值和已超过最大值9,a被移出,get("a")时,需重新加载,此时num为5。
2)基于时间
expireAfterAccess(long, TimeUnit):最后一次访问后的一段时间移出;
expireAfterWrite(long, TimeUnit) :最后一次写入后的一段时间移出;
3 ) 基于引用
键、值默认都是强引用,但键可设置弱引用(weakKeys),值可设置弱(weakValues)或软引用(softValues) 。
强引用:如果一个对象具有强引用,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
软引用:如果一个对象只具有软引用,如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
弱引用:在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
通过recordStats()函数,还可开启缓存的访问统计,通过调用status()方法,返回包含统计信息的CacheStats对象,可以获取缓存的很多统计信息:hitCount(命中成功次数),missCount(命中失败次数),loadSuccessCount(载入成功次数),loadExceptionCount(载入失败次数),totalLoadTime(总载入时间),evictionCount(移除次数),requestCount() (访问次数),hitRate()(命中成功率),missRate()(命中失败率),loadCount()(载入次数)等。
1、自动载入键值至缓存;
2、当缓存器溢出时,采用最近最少使用原则进行替换。
3、过期规则可基于最后读写时间。
4、设置键值引用级别。
5、元素移出通知。
6、缓存访问统计。
示例:
LoadingCache<String, Integer> cache = CacheBuilder.newBuilder()
.maximumSize(10)
.expireAfterWrite(10, TimeUnit.SECONDS)
.build(
new CacheLoader<String, Integer>() {
public Integer load(String key) throws Exception {
return loadKey(key);
}
});
例子中设定了缓存大小为10,写后10秒过期,命中失败时会通过load方法将查询键值加入缓存。
缓存的移出策略主要有以下几种:
1)基于缓存权重
LoadingCache<String, Integer> loadingCache = CacheBuilder.newBuilder()
.maximumWeight(10)
.weigher(new Weigher<String, Integer>() {
public int weigh(String k, Integer v) {
return v; //v的权重设为其本身;
}
})
.recordStats()
.build(
new CacheLoader<String, Integer>() {
public Integer load(String key) {
return num++; //num初始值为1;
}
});
System.out.println(loadingCache.get("a"));
System.out.println(loadingCache.get("b"));
System.out.println(loadingCache.get("c"));
System.out.println(loadingCache.get("d"));
System.out.println(loadingCache.get("a"));
输出结果为1 2 3 4 1,当设置为maximumWeight(9)时,输出结果即为1 2 3 4 5,因为在get("d")时,权重值和已超过最大值9,a被移出,get("a")时,需重新加载,此时num为5。
2)基于时间
expireAfterAccess(long, TimeUnit):最后一次访问后的一段时间移出;
expireAfterWrite(long, TimeUnit) :最后一次写入后的一段时间移出;
3 ) 基于引用
键、值默认都是强引用,但键可设置弱引用(weakKeys),值可设置弱(weakValues)或软引用(softValues) 。
强引用:如果一个对象具有强引用,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
软引用:如果一个对象只具有软引用,如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
弱引用:在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
通过recordStats()函数,还可开启缓存的访问统计,通过调用status()方法,返回包含统计信息的CacheStats对象,可以获取缓存的很多统计信息:hitCount(命中成功次数),missCount(命中失败次数),loadSuccessCount(载入成功次数),loadExceptionCount(载入失败次数),totalLoadTime(总载入时间),evictionCount(移除次数),requestCount() (访问次数),hitRate()(命中成功率),missRate()(命中失败率),loadCount()(载入次数)等。