下面来看一下谷歌工具包的Cache是怎么做的,下面一个简单的demo,缓存的部分参数解释如下:
- initialCapacity:初始容量,默认值16;
- concurrencyLevel:并发控制级别,可以同时写缓存的线程数,默认值4;
- maximumSize:缓存最多可以放多少个元素;
- maximumWeight:指定缓存可能包含的项的最大权重。使用#weiger指定的称重器确定重量,使用此方法需要在调用#build之前对#weiger进行相应的调用;
- weigher:能够决定缓存中实体对象的权重;
- expireAfterAccessNanos:指定在条目创建、最近一次替换其值或最后一次访问后经过固定的持续时间后,应自动从缓存中删除每个条目;所有缓存读写操作(包括cache.asMap())都会重置访问时间。获取(对象)和缓存。
- expireAfterWriteNanos:指定在创建条目或最近替换其值后经过固定的持续时间后,应自动从缓存中删除每个条目;
- refreshNanos:刷新时间;
- keyEquivalence:设置用于比较键的自定义等效策略;
- valueEquivalence:设置用于比较值的自定义等效策略;
- removalListener:设置缓存的移除通知,通过重写onRemoval方法实现。
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.TimeUnit;
public class CacheBuilderDemo {
private static final int EXPIRE_TIME = 2;
private static final int MAXIMUM_SIZE = 2;
private static final long SLEEP_TIME = 1000;
/**
* maximumSize 当缓存达到其最大大小maximumSize时,最早的值将被逐出。默认驱逐策略——LRU(Least Recently Used)
*/
private static final Cache<String, String> CACHE = CacheBuilder.newBuilder()
.expireAfterAccess(EXPIRE_TIME, TimeUnit.SECONDS)
.maximumSize(MAXIMUM_SIZE)
.build();
public static void main(String[] args) throws InterruptedException {
CACHE.put("test", "hello world!");
CACHE.put("test1", "hello world! ok");
Thread.sleep(SLEEP_TIME);
System.out.println(CACHE.getIfPresent("test"));
}
}
它使用了建造者设计模式,利用CacheBuilder中间对象去传入值,使用build方法去实例化对象,build方法不会更改此CacheBuilder实例的状态,因此可以再次调用它以创建多个独立缓存。
@GwtCompatible(emulated = true)
public final class CacheBuilder<K, V> {
private static final int DEFAULT_INITIAL_CAPACITY = 16;
private static final int DEFAULT_CONCURRENCY_LEVEL = 4;
private static final int DEFAULT_EXPIRATION_NANOS = 0;
private static final int DEFAULT_REFRESH_NANOS = 0;
private static final Logger logger = Logger.getLogger(CacheBuilder.class.getName());
int initialCapacity = UNSET_INT;
int concurrencyLevel = UNSET_INT;
long maximumSize = UNSET_INT;
long maximumWeight = UNSET_INT;
Weigher<? super K, ? super V> weigher;
Strength keyStrength;
Strength valueStrength;
long expireAfterWriteNanos = UNSET_INT;
long expireAfterAccessNanos = UNSET_INT;
long refreshNanos = UNSET_INT;
public static CacheBuilder<Object, Object> newBuilder() {
return new CacheBuilder<Object, Object>();
}
... ...
public <K1 extends K, V1 extends V> LoadingCache<K1, V1> build(
CacheLoader<? super K1, V1> loader) {
checkWeightWithWeigher();
return new LocalCache.LocalLoadingCache<K1, V1>(this, loader);
}
}
其他Cache
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。使用方法与Guava/Caffeinecache类似。
参考链接:
1、com.google.common.cache.CacheBuilder.weigher()方法的使用及代码示例_其他_NULL123方法的使用及代码示例_其他_NULL123")