使用guava cache 创建一个本地缓存,结合redis缓存,形成二级缓存
// 定义一个本地缓存
ListeningExecutorService refreshPools = MoreExecutors
.listeningDecorator(Executors.newFixedThreadPool(RELOAD_CACHE_THREADS));
LoadingCache<String, Map<String, WordSplit>> cache = CacheBuilder.newBuilder()
.refreshAfterWrite(30, TimeUnit.MINUTES).expireAfterAccess(1, TimeUnit.HOURS).maximumSize(50)
.build(new CacheLoader<String, Map<String, WordSplit>>() {
@Override
// 当本地缓存命没有中时,调用load方法获取结果并将结果缓存
public Map<String, WordSplit> load(String key) {
LOG.info("开始从redis读取缓存到本地");
Map<String, WordSplit> data = redisOper.scanOneMap(key);
if (data == null || data.isEmpty()) {
String[] keys = key.replace(REDIS_DICT_WORD_PREFIX, "").split("~");
data = splitDict(keys[0], keys[1], keys[2]);
redisOper.setMap(key, data);
LOG.info("触发本地缓存还原redis远程数据");
}
return data;
}
// 刷新
@Override
public ListenableFuture<Map<String, WordSplit>> reload(String key, Map<String, WordSplit> oldValue)
throws Exception {
LOG.info("刷新redis读取缓存到本地");
return refreshPools.submit(new Callable<Map<String, WordSplit>>() {
@Override
public Map<String, WordSplit> call() throws Exception {
Map<String, WordSplit> data = redisOper.scanOneMap(key);
if (data == null || data.isEmpty()) {
String[] keys = key.replace(REDIS_DICT_WORD_PREFIX, "").split("~");
data = splitDict(keys[0], keys[1], keys[2]);
redisOper.setMap(key, data);
LOG.info("触发本地缓存还原redis远程数据");
}
return data;
}
});
}
});