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 ...
随机推荐
- Qt 密码框不可选中、复制、粘贴、无右键菜单等
在做用户登录.修改密码的时候,往往会用到密码框,其中一些功能要求与普通的输入框不同. 例如:不能选中.复制.粘贴.无右键菜单等功能,当然设置密码不可见是必须的! 一般的密码框:(默认 可以选中,复制, ...
- JVM 内部原理(七)— Java 字节码基础之二
JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- android( java) 处理 null 和 预防空指针异常(NullPointerException) 的一些经验。
概述: 在实际编码中总是会遇到 空指针异常 ,本文总结了一些处理空指针的个人经验. 原则: 尽早的检查,尽早的失败. 比如: 通过intent传参到新的目标 activity,而且一定需要这个参数,那 ...
- git初始化本地项目并推送到git服务器
1.创建本地项目,在项目根目录执行git init命令 git init 2.在git服务器上创建一个仓库,这里使用GitHub创建一个仓库. 3.执行git remote add origin &l ...
- 导出表结构sql语句
-- C:/dba必需是已经存在的目录 -- create or replace directory UTL_DIR as 'C:\dba'; --用sys用户登录给要访问的用户指定访问目录的权限gr ...
- ffmpeg 移植到 android 并使用
同步更新至个人blog:http://dxjia.cn/2015/07/ffmpeg-porting-to-android/ 空闲做了个小应用,从视频里截图,然后再将截图拼接为一个gif动画: 起初使 ...
- 80x86的保护模式
什么是保护模式? 通过对程序使用的存储区采用分段.分页的存储管理机制, 达到分组使用.互不干扰的保护目的.能为每个任务提供一台虚拟处理器,使每个任务单独执行,快速切换. 所以,内存地址由段基地址.偏移 ...
- Maven 学习 -- 目录
1. Maven 学习-入门 2. Maven学习-目录结构 3. Maven学习-处理资源文件 啦啦啦
- sshpass: 用于非交互的ssh 密码验证
ssh登陆不能在命令行中指定密码,也不能以shell中随处可见的,sshpass 的出现,解决了这一问题.它允许你用 -p 参数指定明文密码,然后直接登录远程服务器. 它支持密码从命令行,文件,环境变 ...
- fiddler配置手机抓包
参考:https://blog.csdn.net/gld824125233/article/details/52588275 注:我内部用,没有https,不用配置https证书.