代码语言:javascript复制
public class MemoryCache {
private IService service;
private static LoadingCache<String, Data> useCache;
public MemoryCache(IService service) {
this.service = service;
initialized();
}
public Data getResult(String key) {
try {
return useCache.get(key);
} catch (ExecutionException e) {
return service.service(key);
}
}
/**
* 初始化
*/
private void initialized() {
// 若不为空直接结束
if (Objects.nonNull(this.useCache)) {
return;
}
synchronized (MemoryCache.class) {
useCache = CacheBuilder.newBuilder()
//设置并发级别为10
.concurrencyLevel(10)
//设置写缓存后30分钟过期
.expireAfterWrite(30, TimeUnit.MINUTES)
// //设置写缓存后30分钟刷新
// .refreshAfterWrite(30, TimeUnit.MINUTES)
//设置缓存容器的初始容量为5
.initialCapacity(5)
//设置缓存最大容量为500,超过后会按照LRU算法来移除缓存项
.maximumSize(500)
//设置要统计缓存的命中率
.recordStats()
//设置缓存的移除通知
.removalListener((n) -> LOG.info("key:{} expire, execute remove, caught error:{}",
n.getKey(), n.getCause()))
// 缓存不存在时通过CacheLoader的实现自动加载缓存
.build(
new CacheLoader<String, Data>() {
@Override
public Data load(String key) {
return service.service(key);
}
}
);
}
}
}