guava 本地缓存使用

使用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;
						}
					});
				}
			});

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值