Guava cache 示例
pom.xml
<!-- guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
code sample:
package com.ctrip.arch.antibot.cepwriter.data.cache; import com.ctrip.arch.antibot.cepwriter.constant.CommonConstant;
import com.ctrip.arch.antibot.cepwriter.data.entity.BwgResponseEntity;
import com.ctrip.arch.antibot.cepwriter.util.Config;
import com.google.common.cache.*;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class CacheFactory {
private static final Logger logger = LoggerFactory.getLogger(CacheFactory.class);
private static class CacheFactorySingletonHolder {
private static final CacheFactory instance = new CacheFactory();
}
private LoadingCache<String, BwgResponseEntity> bwgCache;
private long maximumSize = 100;
private long refreshAfterWriteSecond = 30;
private long expireAfterWriteMinute = 2;
// guava线程池,用来产生ListenableFuture
private ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)); //========= Private Constructor =========
private CacheFactory(){
try{
init();
bwgCache = buildBwgCache();
}catch(Exception e){
logger.error("CacheFactory(): constructor error!", e);
}
logger.info("CacheFactory(): init over ...");
} //init with config parameter
public void init(){
Config config = Config.getInstance();
String maximumSize_str = config.getParamValue(CommonConstant.CACHE_MAXIMUM_SIZE);
if(StringUtils.isNotBlank(maximumSize_str)){
try{
maximumSize = Long.parseLong(maximumSize_str);
}catch(Exception e){
logger.error("init(): parameter '" + CommonConstant.CACHE_MAXIMUM_SIZE + "' parse error! it must be an integer.");
}
}
logger.info("init(): maximumSize=[" + maximumSize + "]"); String refreshAfterWrite_str = config.getParamValue(CommonConstant.CACHE_REFRESH_AFTER_WRITE_SECOND);
if(StringUtils.isNotBlank(refreshAfterWrite_str)){
try{
refreshAfterWriteSecond = Long.parseLong(refreshAfterWrite_str);
}catch(Exception e){
logger.error("init(): parameter '" + CommonConstant.CACHE_REFRESH_AFTER_WRITE_SECOND + "' parse error! it must be an integer.");
}
}
logger.info("init(): refreshAfterWriteSecond=[" + refreshAfterWriteSecond + "]"); String expireAfterWrite_str = config.getParamValue(CommonConstant.CACHE_EXPIRE_AFTER_WRITE_MINUTE);
if(StringUtils.isNotBlank(expireAfterWrite_str)){
try{
expireAfterWriteMinute = Long.parseLong(expireAfterWrite_str);
}catch(Exception e){
logger.error("init(): parameter '" + CommonConstant.CACHE_EXPIRE_AFTER_WRITE_MINUTE + "' parse error! it must be an integer.");
}
}
logger.info("init(): expireAfterWriteMinute=[" + expireAfterWriteMinute + "]");
} //Expose method
public static CacheFactory getInstance(){
return CacheFactorySingletonHolder.instance;
} //setter/getter
public LoadingCache<String, BwgResponseEntity> getBwgCache() {
return bwgCache;
} //========= biz method =========
/**
* LoadCache - 不需要延迟处理(泛型的方式封装)
* @return
*/
private <K, V> LoadingCache<K, V> initBasicCache(CacheLoader<K, V> cacheLoader) {
LoadingCache<K, V> cache = CacheBuilder
.newBuilder()
.maximumSize(maximumSize)
.refreshAfterWrite(refreshAfterWriteSecond, TimeUnit.SECONDS)
.expireAfterWrite(expireAfterWriteMinute, TimeUnit.MINUTES)
.recordStats() //设置要统计缓存的命中率
.removalListener(new RemovalListener<K, V>(){
@Override
public void onRemoval(RemovalNotification<K, V> rn) {
logger.debug("initBasicCache() -> onRemoval(): key=" + rn.getKey() + " is removed ...");
}})
.build(cacheLoader);
return cache;
} /**
* 获取 bwg cache
*
* @return bwgCache
* @throws Exception
*/
private LoadingCache<String, BwgResponseEntity> buildBwgCache() throws Exception {
LoadingCache<String, BwgResponseEntity> bwgCache = initBasicCache(new CacheLoader<String, BwgResponseEntity>(){
@Override
public BwgResponseEntity load(String appId) throws Exception {
logger.debug("buildBwgCache() -> load(): load data from db, appId=" + appId);
BwgCallable callable = new BwgCallable(appId);
return (BwgResponseEntity) callable.call();
} //refresh data synchronously
@Override
public ListenableFuture<BwgResponseEntity> reload(String key, BwgResponseEntity oldValue) throws Exception {
logger.debug("buildBwgCache() -> reload(): ......后台线程池异步刷新: " + key);
BwgCallable callable = new BwgCallable(key);
return service.submit(callable);
}
});
return bwgCache;
} }
Guava cache 示例的更多相关文章
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- google guava cache缓存基本使用讲解
代码地址:https://github.com/vikde/demo-guava-cache 一.简介 guava cache是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存 ...
- guava cache使用和源码分析
guava cache的优点和使用场景,用来判断业务中是否适合使用此缓存 介绍常用的方法,并给出示例,作为使用的参考 深入解读源码. guava简介 guava cache是一个本地缓存.有以下优点: ...
- Guava Cache用法介绍<转>
Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效.Guava官网介绍,下面的这几种情况可以考虑使用Guava Cache: 愿意消耗一些内存空间来提 ...
- Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache
文章目录 1. Guava Cache 集成 2. 个性化配置 3. 源代码 本文,讲解 Spring Boot 如何集成 Guava Cache,实现缓存. 在阅读「Spring Boot 揭秘与实 ...
- Guava Cache 使用笔记
https://www.cnblogs.com/parryyang/p/5777019.html https://www.cnblogs.com/shoren/p/guava_cache.html J ...
- Guava Cache相关
官方:http://ifeve.com/google-guava-cachesexplained/ 理解:https://segmentfault.com/a/1190000007300118 项目中 ...
- Guava Cache本地缓存
Guava介绍 Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库. 这个库是为了方便编码,并减少编码错误. 这个库提供用于集合,缓存,支持原语,并发性,常见注解,字 ...
- Guava cache使用总结
缓存分为本地缓存和远端缓存.常见的远端缓存有Redis,MongoDB:本地缓存一般使用map的方式保存在本地内存中.一般我们在业务中操作缓存,都会操作缓存和数据源两部分.如:put数据时,先插入DB ...
随机推荐
- MXNET:权重衰减-gluon实现
构建数据集 # -*- coding: utf-8 -*- from mxnet import init from mxnet import ndarray as nd from mxnet.gluo ...
- 【GMT43智能液晶模块】例程五:IWDG看门狗实验——复位ARM
实验原理: STM32内部包含独立看门狗,通过看门狗可以监控程序运行,程序运行 错误时,未在规定时间喂狗,自动复位ARM.本实验通过UI界面中按钮按下 停止喂狗,制造程序运行错误,从而产生复位. 示例 ...
- java中的数据加密5 数字证书
数字证书 A用私钥加密了,那么B接受到消息后,用A提供的公钥解密:那么现在有个讨厌的C,他把消息拦截了,然后用自己的私钥加密,同时把自己的公钥发给B,并告诉B,那是A的公钥,结果....,这时候就需要 ...
- hive表增量抽取到mysql(关系数据库)的通用程序(三)
hive表增量抽取到oracle数据库的通用程序(一) hive表增量抽取到oracle数据库的通用程序(二) 这几天又用到了该功能了,所以又改进了一版,增加了全量抽取和批量抽取两个参数.并且可以设置 ...
- RTMP之后,SRT与QUIC
RTMP协议存在累计延迟与加密方面的问题,为适应互联网视频低延时,高质量的要求,以UDP为核心,具有创造性的SRT,QUIC等流媒体视频方式将成为新的选择 RTMP协议最初是由Macromedia为通 ...
- svn-checkout后,循环遍历查找包含某字符串的文件
这里涉及几个知识点: 1.安装subversion,不多说了,网上有教程 2.循环遍历所有目录层级,找相 关文件 #!/bin/bash #########svn checkout项目出来 svn_d ...
- json 报错'xxx is not JSON serializable'的处理方法
场景: 报错: 原因: json不能对np.int64或者np.float64等类型进行序列化,可以通过自定义serializer或者直接类型转换来解决. 解决方法: 显式的把 date 转换成 in ...
- 【QT】error: 'SIGNAL' was not declared in this scope
error: 'SIGNAL' was not declared in this scope 未在此范围内声明. connect(ui->Btnshowhello,SIGNAL(clicked ...
- [UFLDL] Dimensionality Reduction
博客内容取材于:http://www.cnblogs.com/tornadomeet/archive/2012/06/24/2560261.html Deep learning:三十五(用NN实现数据 ...
- JS 对象的深拷贝和浅拷贝
转载于原文:https://www.cnblogs.com/dabingqi/p/8502932.html 这篇文章是转载于上面的链接地址,觉得写的非常好,所以收藏了,感谢原创作者的分享. 浅拷贝和深 ...