pom.xml


  1. <dependency>
  2. <groupId>com.google.guava</groupId>
  3. <artifactId>guava</artifactId>
  4. <version>24.0-jre</version>
  5. </dependency>

GuavaCacheUtil.java


  1. package com.app.core.util;
  2. import com.google.common.cache.*;
  3. import lombok.extern.log4j.Log4j2;
  4. import org.apache.commons.lang3.ObjectUtils;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.concurrent.ConcurrentMap;
  9. import java.util.concurrent.TimeUnit;
  10. @Log4j2
  11. public class GuavaCacheUtil {
  12. /**
  13. * 缓存项最大数量
  14. */
  15. private static final long GUAVA_CACHE_SIZE = 100000;
  16. /**
  17. * 缓存时间:分钟
  18. */
  19. private static final long GUAVA_CACHE_TIME = 10;
  20. /**
  21. * 缓存操作对象
  22. */
  23. private static LoadingCache<String, Object> GLOBAL_CACHE = null;
  24. static {
  25. try {
  26. GLOBAL_CACHE = loadCache(new CacheLoader<String, Object>() {
  27. public Object load(String key) throws Exception {
  28. // 该方法主要是处理缓存键不存在缓存值时的处理逻辑
  29. if (log.isDebugEnabled())
  30. log.debug("Guava Cache缓存值不存在,初始化空值,键名:{}", key);
  31. return ObjectUtils.NULL;
  32. }
  33. });
  34. } catch (Exception e) {
  35. log.error("初始化Guava Cache出错", e);
  36. }
  37. }
  38. /**
  39. * 全局缓存设置
  40. * <ul>
  41. * <li>缓存项最大数量:100000</li>
  42. * <li>缓存有效时间(分钟):10</li>
  43. * </ul>
  44. *
  45. * @param cacheLoader
  46. * @return
  47. * @throws Exception
  48. */
  49. private static <K, V> LoadingCache<K, V> loadCache(CacheLoader<K, V> cacheLoader) throws Exception {
  50. /*
  51. * maximumSize 缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项 expireAfterAccess 表示最后一次使用该缓存项多长时间后失效 removalListener 移除缓存项时执行的逻辑方法 recordStats 开启Guava Cache的统计功能
  52. */
  53. LoadingCache<K, V> cache = CacheBuilder.newBuilder().maximumSize(GUAVA_CACHE_SIZE).expireAfterAccess(GUAVA_CACHE_TIME, TimeUnit.MINUTES)
  54. .removalListener(new RemovalListener<K, V>() {
  55. public void onRemoval(RemovalNotification<K, V> rn) {
  56. if (log.isDebugEnabled())
  57. log.debug("Guava Cache缓存回收成功,键:{}, 值:{}", rn.getKey(), rn.getValue());
  58. }
  59. }).recordStats().build(cacheLoader);
  60. return cache;
  61. }
  62. /**
  63. * 设置缓存值
  64. *
  65. * @param key
  66. * @param value
  67. */
  68. public static void put(String key, Object value) {
  69. try {
  70. GLOBAL_CACHE.put(key, value);
  71. if (log.isDebugEnabled())
  72. log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
  73. } catch (Exception e) {
  74. log.error("设置缓存值出错", e);
  75. }
  76. }
  77. /**
  78. * 批量设置缓存值
  79. *
  80. * @param map
  81. */
  82. public static void putAll(Map<? extends String, ? extends Object> map) {
  83. try {
  84. GLOBAL_CACHE.putAll(map);
  85. if (log.isDebugEnabled())
  86. log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
  87. } catch (Exception e) {
  88. log.error("批量设置缓存值出错", e);
  89. }
  90. }
  91. /**
  92. * 获取缓存值
  93. * <p>注:如果键不存在值,将调用CacheLoader的load方法加载新值到该键中</p>
  94. *
  95. * @param key
  96. * @return
  97. */
  98. public static Object get(String key) {
  99. Object obj = null;
  100. try {
  101. obj = GLOBAL_CACHE.get(key);
  102. if (log.isDebugEnabled())
  103. log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
  104. } catch (Exception e) {
  105. log.error("获取缓存值出错", e);
  106. }
  107. return obj;
  108. }
  109. /**
  110. * 获取缓存值
  111. * <p>注:如果键不存在值,将直接返回 NULL</p>
  112. *
  113. * @param key
  114. * @return
  115. */
  116. public static Object getIfPresent(String key) {
  117. Object obj = null;
  118. try {
  119. obj = GLOBAL_CACHE.getIfPresent(key);
  120. if (log.isDebugEnabled())
  121. log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
  122. } catch (Exception e) {
  123. log.error("获取缓存值出错", e);
  124. }
  125. return obj;
  126. }
  127. /**
  128. * 移除缓存
  129. *
  130. * @param key
  131. */
  132. public static void remove(String key) {
  133. try {
  134. GLOBAL_CACHE.invalidate(key);
  135. if (log.isDebugEnabled())
  136. log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
  137. } catch (Exception e) {
  138. log.error("移除缓存出错", e);
  139. }
  140. }
  141. /**
  142. * 批量移除缓存
  143. *
  144. * @param keys
  145. */
  146. public static void removeAll(Iterable<String> keys) {
  147. try {
  148. GLOBAL_CACHE.invalidateAll(keys);
  149. if (log.isDebugEnabled())
  150. log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
  151. } catch (Exception e) {
  152. log.error("批量移除缓存出错", e);
  153. }
  154. }
  155. /**
  156. * 清空所有缓存
  157. */
  158. public static void removeAll() {
  159. try {
  160. GLOBAL_CACHE.invalidateAll();
  161. if (log.isDebugEnabled())
  162. log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
  163. } catch (Exception e) {
  164. log.error("清空所有缓存出错", e);
  165. }
  166. }
  167. /**
  168. * 获取缓存项数量
  169. *
  170. * @return
  171. */
  172. public static long size() {
  173. long size = 0;
  174. try {
  175. size = GLOBAL_CACHE.size();
  176. if (log.isDebugEnabled())
  177. log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
  178. } catch (Exception e) {
  179. log.error("获取缓存项数量出错", e);
  180. }
  181. return size;
  182. }
  183. /**
  184. * 获取所有缓存项的键
  185. *
  186. * @return
  187. */
  188. public static List<String> keys() {
  189. List<String> list = new ArrayList<String>();
  190. try {
  191. ConcurrentMap<String, Object> map = GLOBAL_CACHE.asMap();
  192. for (Map.Entry<String, Object> item : map.entrySet())
  193. list.add(item.getKey());
  194. if (log.isDebugEnabled())
  195. log.debug("缓存命中率:{},新值平均加载时间:{}", getHitRate(), getAverageLoadPenalty());
  196. } catch (Exception e) {
  197. log.error("获取所有缓存项的键出错", e);
  198. }
  199. return list;
  200. }
  201. /**
  202. * 缓存命中率
  203. *
  204. * @return
  205. */
  206. public static double getHitRate() {
  207. return GLOBAL_CACHE.stats().hitRate();
  208. }
  209. /**
  210. * 加载新值的平均时间,单位为纳秒
  211. *
  212. * @return
  213. */
  214. public static double getAverageLoadPenalty() {
  215. return GLOBAL_CACHE.stats().averageLoadPenalty();
  216. }
  217. /**
  218. * 缓存项被回收的总数,不包括显式清除
  219. *
  220. * @return
  221. */
  222. public static long getEvictionCount() {
  223. return GLOBAL_CACHE.stats().evictionCount();
  224. }
  225. }

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. HDU 4349——Xiao Ming's Hope——————【Lucas定理】

    Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. node搭环境(三)之安装vue-devtools

    前面已经安装了bower gulp,马上要学vue了,今天安装vue及调试神器vue-devtools 安装步骤: 1.在GitHub上输入 github.com/vuejs/vue-devtool后 ...

  3. webgl学习总结画线面及场景和物体动

    WebGL是在浏览器中实现三维效果的一套规范.是浏览器中的3D引擎,是利用js代码来实现加载3D模型,渲染.输出等功能,从而实现在浏览器和微信中浏览三维文件的效果. three.js是基于WebGL的 ...

  4. 如何使用JWT来实现单点登录功能

    我们平时自己开发项目,分布式的结构时,访问量不大,但是又不想搭建redis服务器,这时我觉得jwt不错. 个人理解,jwt就是类似于一把锁和钥匙,客户来租房(登录),我们需要给他进来(第一次登录)登记 ...

  5. hibernate课程 初探一对多映射1-1 课程简介

    hibernate 常见映射类型 one-to-many many-to-one one-to-one many-to-many

  6. HTML头部元素实例

    HTML head 元素 标签 描述 <head> 定义了文档的信息 <title> 定义了文档的标题 <base> 定义了页面链接标签的默认链接地址 <li ...

  7. Android Studio快捷键【Android学习入门】

    Studio快捷键[Android学习入门]" title="Android Studio快捷键[Android学习入门]"> 提示 Ctrl+P方法参数提示 Ct ...

  8. Prestashop-1.6.1.6-zh_CN (Openlogic CentOS 7.2)

    平台: CentOS 类型: 虚拟机镜像 软件包: prestashop1.6.1.6 commercial content management ecommerce open-source 简体中文 ...

  9. shell脚本学习(3)文件判断

    shell常用的文件判断运算符如下: -e 文件是否存在 -f  文件是否是普通文件(不是目录.设备文件.链接文件) -s  表示文件大小不为0 -d 表示文件是否是目录 -b 表示是块设备(光驱.软 ...

  10. 从HTTP响应头判断是否命中CDN

    腾讯云: X-Cache-Lookup:Hit From MemCache 表示命中CDN节点的内存X-Cache-Lookup:Hit From Disktank 表示命中CDN节点的磁盘X-Cac ...