pom.xml


<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>24.0-jre</version>
</dependency>

GuavaCacheUtil.java


package com.app.core.util; import com.google.common.cache.*;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.ObjectUtils; import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit; @Log4j2
public class GuavaCacheUtil {
/**
* 缓存项最大数量
*/
private static final long GUAVA_CACHE_SIZE = 100000;
/**
* 缓存时间:分钟
*/
private static final long GUAVA_CACHE_TIME = 10; /**
* 缓存操作对象
*/
private static LoadingCache<String, Object> GLOBAL_CACHE = null; static {
try {
GLOBAL_CACHE = loadCache(new CacheLoader<String, Object>() {
public Object load(String key) throws Exception {
// 该方法主要是处理缓存键不存在缓存值时的处理逻辑
if (log.isDebugEnabled())
log.debug("Guava Cache缓存值不存在,初始化空值,键名:{}", key);
return ObjectUtils.NULL;
}
});
} catch (Exception e) {
log.error("初始化Guava Cache出错", e);
}
} /**
* 全局缓存设置
* <ul>
* <li>缓存项最大数量:100000</li>
* <li>缓存有效时间(分钟):10</li>
* </ul>
*
* @param cacheLoader
* @return
* @throws Exception
*/
private static <K, V> LoadingCache<K, V> loadCache(CacheLoader<K, V> cacheLoader) throws Exception {
/*
* maximumSize 缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项 expireAfterAccess 表示最后一次使用该缓存项多长时间后失效 removalListener 移除缓存项时执行的逻辑方法 recordStats 开启Guava Cache的统计功能
*/
LoadingCache<K, V> cache = CacheBuilder.newBuilder().maximumSize(GUAVA_CACHE_SIZE).expireAfterAccess(GUAVA_CACHE_TIME, TimeUnit.MINUTES)
.removalListener(new RemovalListener<K, V>() {
public void onRemoval(RemovalNotification<K, V> rn) {
if (log.isDebugEnabled())
log.debug("Guava Cache缓存回收成功,键:{}, 值:{}", rn.getKey(), rn.getValue());
}
}).recordStats().build(cacheLoader);
return cache;
} /**
* 设置缓存值
*
* @param key
* @param value
*/
public static void put(String key, Object value) {
try {
GLOBAL_CACHE.put(key, value);
if (log.isDebugEnabled())
log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
} catch (Exception e) {
log.error("设置缓存值出错", e);
}
} /**
* 批量设置缓存值
*
* @param map
*/
public static void putAll(Map<? extends String, ? extends Object> map) {
try {
GLOBAL_CACHE.putAll(map);
if (log.isDebugEnabled())
log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
} catch (Exception e) {
log.error("批量设置缓存值出错", e);
}
} /**
* 获取缓存值
* <p>注:如果键不存在值,将调用CacheLoader的load方法加载新值到该键中</p>
*
* @param key
* @return
*/
public static Object get(String key) {
Object obj = null;
try {
obj = GLOBAL_CACHE.get(key);
if (log.isDebugEnabled())
log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
} catch (Exception e) {
log.error("获取缓存值出错", e);
}
return obj;
} /**
* 获取缓存值
* <p>注:如果键不存在值,将直接返回 NULL</p>
*
* @param key
* @return
*/
public static Object getIfPresent(String key) {
Object obj = null;
try {
obj = GLOBAL_CACHE.getIfPresent(key);
if (log.isDebugEnabled())
log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
} catch (Exception e) {
log.error("获取缓存值出错", e);
}
return obj;
} /**
* 移除缓存
*
* @param key
*/
public static void remove(String key) {
try {
GLOBAL_CACHE.invalidate(key);
if (log.isDebugEnabled())
log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
} catch (Exception e) {
log.error("移除缓存出错", e);
}
} /**
* 批量移除缓存
*
* @param keys
*/
public static void removeAll(Iterable<String> keys) {
try {
GLOBAL_CACHE.invalidateAll(keys);
if (log.isDebugEnabled())
log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
} catch (Exception e) {
log.error("批量移除缓存出错", e);
}
} /**
* 清空所有缓存
*/
public static void removeAll() {
try {
GLOBAL_CACHE.invalidateAll();
if (log.isDebugEnabled())
log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
} catch (Exception e) {
log.error("清空所有缓存出错", e);
}
} /**
* 获取缓存项数量
*
* @return
*/
public static long size() {
long size = 0;
try {
size = GLOBAL_CACHE.size();
if (log.isDebugEnabled())
log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
} catch (Exception e) {
log.error("获取缓存项数量出错", e);
}
return size;
} /**
* 获取所有缓存项的键
*
* @return
*/
public static List<String> keys() {
List<String> list = new ArrayList<String>();
try {
ConcurrentMap<String, Object> map = GLOBAL_CACHE.asMap();
for (Map.Entry<String, Object> item : map.entrySet())
list.add(item.getKey());
if (log.isDebugEnabled())
log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
} catch (Exception e) {
log.error("获取所有缓存项的键出错", e);
}
return list;
} /**
* 缓存命中率
*
* @return
*/
public static double getHitRate() {
return GLOBAL_CACHE.stats().hitRate();
} /**
* 加载新值的平均时间,单位为纳秒
*
* @return
*/
public static double getAverageLoadPenalty() {
return GLOBAL_CACHE.stats().averageLoadPenalty();
} /**
* 缓存项被回收的总数,不包括显式清除
*
* @return
*/
public static long getEvictionCount() {
return GLOBAL_CACHE.stats().evictionCount();
}
}

Guava Cache 工具类 [ GuavaCacheUtil ]的更多相关文章

  1. Guava Cache 工具类

    maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava&l ...

  2. Cache 工具类

    package com.thinkgem.jeesite.common.utils; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheM ...

  3. Guava 常用工具类

    引入guava包: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava ...

  4. apache-commons和guava的工具类

    apache-commons工具类:https://www.iteye.com/blog/zhoualine-1770014 guava工具类:https://blog.csdn.net/Dream_ ...

  5. Google Guava Cache 全解析

    Google guava工具类的介绍和使用https://blog.csdn.net/wwwdc1012/article/details/82228458 LoadingCache缓存使用(Loadi ...

  6. Guava 开源工具的简单介绍

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  7. Jeesite的cahche工具类

    本CacheUtils主要是基于shiro的cache进行处理. 其他选择: 类似的我们可以选择java cache ,spring cahche等方案.                   再进一步 ...

  8. java JedisUtils工具类

    package com.sh.xrsite.common.utils; import java.util.List; import java.util.Map; import java.util.Se ...

  9. Redis工具类

    /** * Copyright © 2012-2016 * <a href="https://github.com/thinkgem/smkj">smkj</a& ...

随机推荐

  1. jQuery Validate验证框架详解(转)

    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type=& ...

  2. Spring Bean相互依赖问题

    如果是通过get,set 注入就不会有问题 如果是通过构造函数注入,SPRING就会报循环引用注入出错 循环依赖——在采用构造器注入的方式配置bean时,很有可能会产生循环依赖的情况.比如说,一个类A ...

  3. hdu 3530 区间和在一定范围内最长区间

    http://acm.hust.edu.cn/vjudge/problem/11253 这题要找到区间和在[m,k]范围内的最长区间 用两个单调序列保存区间最大值和最小值.当最大值-最小值>k时 ...

  4. (生产)better-scroll - 下拉刷新

    Options 参数 startX: 0 开始的X轴位置 startY: 0 开始的Y轴位置 scrollY: true 滚动方向为 Y 轴 scrollX: 'true' 滚动方向为 X 轴 cli ...

  5. oracle笔记2-多表查询和子查询

    --查询出当前用户下的所有表 select table_name from user_tables; --执行顺序原则:  from  where group by  having   select  ...

  6. Android OS Startup

    OS puts emphases on how to provide interfaces to user's APPs for using hardware device in the conven ...

  7. SpringCloud的学习记录(7)

    这一章节讲zuul的使用. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Artifact等信息, 这里 ...

  8. oracle的数值数据类型和兼容细分类型

    Oracle存储数值类型的数据不区分int .double .float 等类型,统一使用number(p,s)来存储. 基本类型为 NUMBER(P,S) P范围1到38 S 范围 -84 到 12 ...

  9. socks v5 协议解析

    socks v5是一种用于代理的协议,就是说client用这种协议与server沟通,让server帮忙代访问remote后再将结果通过此协议返给client,所以一般是涉及到3个端,分别是clien ...

  10. sql:表中数据全部删除之后,重新插入时,从1开始增加

    数据库中设置了自增列,有时候需要清楚数据库从新录入数据.最常见的做法就是使用sql语句"delete 表明名"或是直接选中数据,然后删除数据.但是再次插入数据的时候,你就会发现自增 ...