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 示例的更多相关文章

  1. Spring cache简单使用guava cache

    Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...

  2. google guava cache缓存基本使用讲解

    代码地址:https://github.com/vikde/demo-guava-cache 一.简介 guava cache是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存 ...

  3. guava cache使用和源码分析

    guava cache的优点和使用场景,用来判断业务中是否适合使用此缓存 介绍常用的方法,并给出示例,作为使用的参考 深入解读源码. guava简介 guava cache是一个本地缓存.有以下优点: ...

  4. Guava Cache用法介绍<转>

    Guava Cache是在内存中缓存数据,相比较于数据库或redis存储,访问内存中的数据会更加高效.Guava官网介绍,下面的这几种情况可以考虑使用Guava Cache: 愿意消耗一些内存空间来提 ...

  5. Spring Boot 揭秘与实战(二) 数据缓存篇 - Guava Cache

    文章目录 1. Guava Cache 集成 2. 个性化配置 3. 源代码 本文,讲解 Spring Boot 如何集成 Guava Cache,实现缓存. 在阅读「Spring Boot 揭秘与实 ...

  6. Guava Cache 使用笔记

    https://www.cnblogs.com/parryyang/p/5777019.html https://www.cnblogs.com/shoren/p/guava_cache.html J ...

  7. Guava Cache相关

    官方:http://ifeve.com/google-guava-cachesexplained/ 理解:https://segmentfault.com/a/1190000007300118 项目中 ...

  8. Guava Cache本地缓存

    Guava介绍 Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库. 这个库是为了方便编码,并减少编码错误. 这个库提供用于集合,缓存,支持原语,并发性,常见注解,字 ...

  9. Guava cache使用总结

    缓存分为本地缓存和远端缓存.常见的远端缓存有Redis,MongoDB:本地缓存一般使用map的方式保存在本地内存中.一般我们在业务中操作缓存,都会操作缓存和数据源两部分.如:put数据时,先插入DB ...

随机推荐

  1. 【Unity】ShareSDK、SMSSDK的基本使用与常见问题

    概要 测试使用ShareSDK的一些常用功能.包括: 用微博帐号做第三方登录 获取用户的帐号详细信息 获取好友列表 分享功能 测试使用SMSSDK插件,包括: 导入插件,解决包冲突 短信登录功能:发验 ...

  2. JavaScript高级用法一之事件响应与网页交互

    综述 本篇的主要内容来自慕课网,事件响应与网页交互,主要内容如下 1 什么是事件 2 鼠标单击事件( onclick ) 3 鼠标经过事件(onmouseover) 4 鼠标移开事件(onmouseo ...

  3. 让ubuntu下的eclipse支持GBK编码

    把Windows下工程导入Linux下Eclipse中,由于以前的工程代码,都是GBK编码,而Ubuntu默认不支持GBK编码,所以,我们要让Ubuntu支持GBK,方法如下: 1.修改/var/li ...

  4. H3C ER6300 + 两台 H3C S5120 组网举例

    组网需求: 1.H3C ER6300 作出口路由.防火墙及Qos限速等功能(ER6300 配置LAN口 192.168.30.254默认网关) 2.H3C S5120 两台配置相同VLAN10 VLA ...

  5. .Net MVC Cache 缓存技术总结

    一.细说 ASP.NET Cache 及其高级用法 二..Net环境下的缓存技术介绍 (转) 三.asp.net中缓存的使用介绍一 四.HttpContext.Current.Cache 过期时间

  6. Spring源码学习:day2

    前言: 我还是太懒了,连截图都懒得粘贴,故直接用书上说的话的截图吧. 代码的编写过程都是应该有一个入口的,所有的代码最终都是为了那个入口更加方便更加简单而产生的. 看代码的过程,就应该抓住主线,顺着主 ...

  7. Core Animation 动画的使用:关键帧动画、基础动画、动画组

    首先让我们了解下什么是 Core Animation,Core Animation 为核心动画,他为图形渲染和动画提供了基础.使用核心动画,我们只需要设置起点.终点.关键帧等一些参数,剩下的工作核心动 ...

  8. cookie是如何保存到客户端,又是如何发送到服务端

    Cookie相关的Http头     有 两个Http头部和Cookie有关:Set-Cookie和Cookie.     Set-Cookie由服务器发送,它包含在响应请求的头部中.它用于在客户端创 ...

  9. JSESSIONID、SESSION、cookie .

    所谓session可以这样理解:当与服务端进行会话时,比如说登陆成功后,服务端会为用户开壁一块内存区间,用以存放用户这次会话的一些内容,比如说用户名之类的.那么就需要一个东西来标志这个内存区间是你的而 ...

  10. [Stats385] Lecture 05: Avoid the curse of dimensionality

    Lecturer 咖中咖 Tomaso A. Poggio Lecture slice Lecture video 三个基本问题: Approximation Theory: When and why ...