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. sqlmap tamter

    支持的数据库 编号 脚本名称 作用 实现方式 all 1 apostrophemask.py 用utf8代替引号 ("1 AND '1'='1") '1 AND %EF%BC%87 ...

  2. linux下安装Oracle时交换空间不足的解决方法

    摘:linux下安装Oracle时交换空间不足的解决方法 linux上安装Oracle时交换空间不足的解决办法 增加交换空间有两种方法: 严格的说,在系统安装完后只有一种方法可以增加swap,那就是本 ...

  3. 【iCore1S 双核心板_ARM】例程二:读取ARM按键状态

    实验原理: 按键的一端与STM32的GPIO(PB9)相连,且PB9外接一个1k大小的限流上接电阻. 初始化时把PB9设置成输入模式,当按键弹起时,PB9由于上拉电阻的作用呈高电平(3.3V): 当按 ...

  4. WebRTC信令控制简介与STUN, TURN服务器搭建

    本文将向大家介绍两个方面的知识: WebRTC信令控制 STUN/TURN服务器的搭建 在前面的文章中已经向大家介绍了如何构建信令服务器.但构建的信令服务器是如何工作的?哪些消息需要信令服务器控制和中 ...

  5. TCP/IP模型及OSI七层参考模型各层的功能和主要协议

    注:网络体系结构是分层的体系结构,学术派标准OSI参考模型有七层,而工业标准TCP/IP模型有四层.后者成为了事实上的标准,在介绍时通常分为5层来叙述但应注意TCP/IP模型实际上只有四层. 1.TC ...

  6. Http 调用netty 服务,服务调用客户端,伪同步响应.ProtoBuf 解决粘包,半包问题.

    实际情况是: 公司需要开发一个接口给新产品使用,需求如下 1.有一款硬件设备,客户用usb接上电脑就可以,但是此设备功能比较单一,所以开发一个服务器程序,辅助此设备业务功能 2.解决方案,使用Sock ...

  7. js将图片转换为base64

    直接上代码: var img = "imgurl";//imgurl 就是你的图片路径 function getBase64Image(img) { var canvas = do ...

  8. Spark RDD 默认分区数量 - repartitions和coalesce异同

    RDD.getNumPartitions()方法可以获得一个RDD分区数量, 1.默认由文件读取的话,本地文件会进行shuffle,hdfs文件默认会按照dfs分片来设定. 2.计算生成后,默认会按照 ...

  9. MySql 远程连接的条件

    1.首先看服务器防火墙 引用:http://www.cnblogs.com/silent2012/archive/2015/07/28/4682770.html CentOS 7.0默认使用的是fir ...

  10. ML.NET教程之客户细分(聚类问题)

    理解问题 客户细分需要解决的问题是按照客户之间的相似特征区分不同客户群体.这个问题的先决条件中没有可供使用的客户分类列表,只有客户的人物画像. 数据集 已有的数据是公司的历史商业活动记录以及客户的购买 ...