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 ...
随机推荐
- Ogre2.1 Hlms与渲染流程
在我前面三篇说明Ogre2.x的文章里,第一篇大致说了下Hlms,第二篇说了下和OpenGL结合比较紧的渲染,本文用来说下Hlms如何影响渲染流程中,因为有些概念已经在前面二文里说过了,本文就不再提, ...
- WPF之依赖属性和附加属性
参考资料: 一站式WPF--依赖属性(DependencyProperty)一 一站式WPF--依赖属性(DependencyProperty)二 依赖属性之我见: 这两篇文章介绍的 ...
- ios 消除 字符串 首尾空格
本文转载至 http://blog.csdn.net/reylen/article/details/8233353 (1)系统去首尾空格方法,使用NSString中的str = [str string ...
- puppt服务资源管理
1.服务资源的特性 controllable 提供变量控制 enableable 可以启动 停止服务 refreshable 可以重启服务 2.可用参数: ensure ...
- android基础---->service的生命周期
服务是一个应用程序组件代表应用程序执行一个长时间操作的行为,虽然不与用户交互或供应功能供其它应用程序使用.它和其他的应用对象一样,在他的宿主进程的主线程中运行.今天我们开始android中普通serv ...
- day_5.22 py
#!/usr/bin/env/python #-*-coding:utf-8-*- ''' 私有化 __相当于prevate 外部不能直接调用,只能通过set get方法用 property ''' ...
- B - Space Ant
The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists trace ...
- I - 迷宫问题
定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...
- 极验(geetest)验证码
最近在做项目的时候,需要用到登录验证,在网上看到了一个很不错的验证插件,在此记录一下使用流程. 极限验证码 官网:http://www.geetest.com/,到GitHub下载服务端代码htt ...
- python金融与量化分析----Jupyter Notebook使用
Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言.在本文中,我们将介绍 Jupyter notebook 的主要特性,以 ...