Guava介绍

Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库。

这个库是为了方便编码,并减少编码错误。

这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法。

Guava Cache适用场景

1 消耗一些内存空间来提升速度;

2 缓存中存放的数据总量不会超出内存容量。

(Guava Cache是单个应用运行时的本地缓存,不把数据存放到文件或外部服务器(Memcached, Redis))

Guava Cache介绍

数据结构:ConcurrentHash (The returned cache is implemented as a hash table with similar performance characteristics to ConcurrentHashMap.)

主要特性(详见下面的相关链接):

1 自动加载

2 回收策略:

2.1 基于容量

2.2 基于存活时间

2.3 基于权重

2.4 基于引用

3 移除监听器

4 缓存访问统计

主要接口:CacheBuilder, LoadingCache, CacheStats

使用示例:

public class CacheProTest {LoadingCache<Long, Person> cache;private int cacheTimeoutSeconds = 10; // 10秒Integer counter = 1;@Beforepublic void initialize() {System.out.println("初始化");cache = CacheBuilder.newBuilder()/* 回收策略:基于容量(least-recently-used eviction when a maximum size is exceeded) */.maximumSize(10) // .initialCapacity(initialCapacity)/* 回收策略:基于存活时间(time-based expiration of entries, measured since last access or last write) */.expireAfterWrite(cacheTimeoutSeconds, TimeUnit.SECONDS)// .expireAfterAccess(duration, unit)// .refreshAfterWrite(duration, unit)/* 回收策略:基于权重 */// .maximumWeight(maximumWeight)// .weigher(weigher)/* 回收策略:基于引用(keys automatically wrapped in weak references, values automatically wrapped in weak or soft references)*/// .weakKeys()// .weakValues()// .softValues()// 设置并发数为5,即同一时间最多只能有5个线程往cache执行写入操作// .concurrencyLevel(concurrencyLevel)/* 缓存访问统计(accumulation of cache access statistics) */.recordStats()/* 移除监听器(notification of evicted (or otherwise removed) entries) */// .removalListener(listener).build(new CacheLoader<Long, Person>() {/* 自动加载(automatic loading of entries into the cache) */@Overridepublic Person load(Long id) throws Exception {System.out.println("获取值, id=" + id);// 调用接口获取值Person p = new Person();p.setId(id);p.setName("name" + counter.toString());counter++;return p;}});}@Testpublic void test1() {try {/* 获值 */// ConcurrentMap<Long, Person> asMap = cache.asMap();// cache.get(key); //// cache.getAll(keys);// cache.getIfPresent(key);// cache.getAllPresent(keys);// cache.size();/* 存值 */// cache.put(key, value);// cache.putAll(m); // Map<? extends K, ? extends V> m/* 移除/删除 */// cache.refresh(key);// cache.invalidate(key);// cache.invalidateAll();// cache.invalidateAll(keys);// cache.cleanUp();/* 缓存访问统计 */CacheStats stats = cache.stats();stats.averageLoadPenalty();stats.evictionCount();stats.hitCount();stats.hitRate();stats.loadCount();stats.loadExceptionCount();stats.loadExceptionRate();stats.loadSuccessCount();stats.missCount();stats.missRate();stats.requestCount();stats.totalLoadTime();} catch (Exception e) {e.printStackTrace();}}@Testpublic void test2() {try {Long id = 1L;Person person1 = cache.get(id);Thread.sleep(3L * 1000L);Person person2 = cache.get(id);Thread.sleep(11L * 1000L);Person person3 = cache.get(id);System.out.println(person1);System.out.println(person2);System.out.println(person3);} catch (Exception e) {e.printStackTrace();}}
}class Person implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return JSON.toJSONString(this);}
}

  

Guava Cache使用时需要关注的点

1 了解LoadingCache.refresh

正如LoadingCache.refresh(K)所声明,刷新表示为键加载新值,这个过程可以是异步的。

在刷新操作进行时,缓存仍然可以向其他线程返回旧值,而不像回收操作,读缓存的线程必须等待新值加载完成。

如果刷新过程抛出异常,缓存将保留旧值,而异常会在记录到日志后被丢弃[swallowed]。

重载CacheLoader.reload(K, V)可以扩展刷新时的行为,这个方法允许开发者在计算新值时使用旧的值。

2 了解 清理时机

使用CacheBuilder构建的缓存不会"自动"执行清理和回收工作,也不会在某个缓存项过期后马上清理,也没有诸如此类的清理机制。

它会在写操作时顺带做少量的维护工作,或者偶尔在读操作时做——如果写操作实在太少的话。

因此使用LoadingCache.size() 一定要关注这个点。

相关链接

github 地址

易宝教程:Guava教程

CSDN:GuavaCache简介

并发编程网:[Google Guava] 3-缓存

转载于:https://www.cnblogs.com/ken-jl/p/8997853.html

Guava Cache本地缓存相关推荐

  1. Guava Cache本地缓存在 Spring Boot应用中的实践

    概述 在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小.而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是 ...

  2. 基于guava实现本地缓存

    package com.daojia.service.djwechat.utils;import com.google.common.cache.Cache; import com.google.co ...

  3. Guava CacheBuilder 本地缓存的使用

    目录 前言 CacheBuilder代码截图 使用示例代码举例 CacheLoader加载 缓存回收 基于容量的回收(size-based eviction) 定时回收(Timed Eviction) ...

  4. Google Guava Cache--localcache本地缓存实例

    何为缓存?本地缓存类似于map,当给定一个key,首先查找缓存中是否已经有值了,如果有则直接返回数据:相反如果不存在这样的key,则将新的内容value值缓存起来,以便下一次来查询,可以快速返回. 当 ...

  5. 重新认识下JVM级别的本地缓存框架Guava Cache——优秀从何而来

    Guava Cache初识 Guava是Google提供的一套JAVA的工具包,而Guava Cache则是该工具包中提供的一套完善的JVM级别的高并发缓存框架.其实现机制类似ConcurrentHa ...

  6. 3. java缓存-线程内缓存guava cache

    guava cache的缓存结构 常用的guava cache缓存 根据上图中的缓存框架,我们常用的一些缓存实例有:LocalManualCache和LocalLoadingCache,两者唯一的区别 ...

  7. Guava Cache 如何防止缓存击穿

    GuavaCache基本用法 如果我们需要对从db获取的数据增加本地缓存,缓存10s过期,用guava cache很简单: 初始化一个Cache对象,定义load方法,或者在获取值的时候传一个load ...

  8. 万字详解本地缓存之王 Caffeine

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自:r6d.cn/UXR4 概要 Caffeine[1] ...

  9. 是什么让 Spring5 放弃了使用 Guava Cache?

    来源:https://albenw.github.io/posts/a4ae1aa2/ 概要 Caffeine是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是Gu ...

  10. 基于LRU-K算法设计本地缓存实现流量削峰

    1.背景介绍 1.1.现象 QPS突然增长2倍以上(45w~60w每分钟) 将产生下面一些问题: 1)响应接口响应时长增加了5倍(qps增加了2倍): 2)机房局域网交换机带宽报警(1kM带宽使用了9 ...

最新文章

  1. VUE 动态绑定class
  2. 现代化医学信息管理c语言,山西医科大学_院校信息库_阳光高考
  3. 【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | 引入线程安全概念 )
  4. 如何更改已生成的APK的APP名字?
  5. Java中ListE对象赋值问题(引用传递和值传递)
  6. k8s 给worker/master节点打标签(角色标签)
  7. hexo的yelee主题本地搜索故障
  8. Java 内存 关系_发生在Java内存模型中的关系之前
  9. 设置环境变量ANDROID_SDK_HOME有什么用?
  10. 容器编排技术 -- Kubernetes kubectl create secret generic 命令详解
  11. 零基础转行学习python是否还在纠结?这里告诉你答案!
  12. 微信又上线新功能,能让你更会聊天?
  13. kvm虚拟化学习笔记(十)之kvm虚拟机快照备份
  14. grub引导U盘(集成常用工具/深山红叶PE工具箱V30/完美者U盘维护系统V8.1)
  15. SQL Server里的闩锁介绍
  16. Oracle物化视图的一般使用【转】
  17. 房地产大数据分析方法
  18. SubmitButton
  19. Fair Resource Allocation in Federated Learning
  20. 在 Jenkins 上轻松重用 Tekton 和 Jenkins X

热门文章

  1. [swift 进阶]读书笔记-C2P3_Set、 C2P4_Range
  2. 源码安装MySQL步骤
  3. [saiku] JCR在saiku中的运用原理
  4. 1年内从2000涨到13000的成长经验分享
  5. AMD Fusion 开发者峰会透漏的信息
  6. 2004-6-22+ 用vs.net做的留言板
  7. android依赖alert样式,Android - AlertDialog样式
  8. 全国最优秀的计算机学校,2020全国最好的计算机专业学校排名
  9. scrcpy能显示不能控制
  10. SpringMVC的RESTful(一)