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; @Before
public 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) */
@Override
public 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;
}
});
} @Test
public 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();
}
} @Test
public 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;
} @Override
public 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-缓存

Guava Cache本地缓存的更多相关文章

  1. Guava Cache 本地缓存组件浅析

    cache组件中核心的类和接口列举如下: 接口: Cache 本地缓存的顶级接口,提供一些对缓存进行get,put的方法,以及获取缓存统计数据的方法等. LoadingCache 继承了Cache接口 ...

  2. Guava Cache,Java本地内存缓存使用实践

    Guava Cache,网上介绍很多,我就不赘述了. 分享一篇好的文章: Guava Cache内存缓存使用实践-定时异步刷新及简单抽象封装 Google Guava 3-缓存 在原作者基础上,我做了 ...

  3. springboot之本地缓存(guava与caffeine)

    1. 场景描述 因项目要使用本地缓存,具体为啥不用redis等,就不讨论,记录下过程,希望能帮到需要的朋友. 2.解决方案 2.1 使用google的guava作为本地缓存 初步的想法是使用googl ...

  4. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  5. Guava的两种本地缓存策略

    Guava的两种缓存策略 缓存在很多场景下都需要使用,如果电商网站的商品类别的查询,订单查询,用户基本信息的查询等等,针对这种读多写少的业务,都可以考虑使用到缓存.在一般的缓存系统中,除了分布式缓存, ...

  6. 同时使用Redis缓存和Google Guava本地缓存注意事项(深拷贝和浅拷贝)

    目录 1.问题场景及说明 2.Redis 缓存是深拷贝 3.Guava本地缓存直接获取则是浅拷贝 4.如何实现Guava获取本地缓存是深拷贝? 1.问题场景及说明 系统中同时使用 Redis 缓存和 ...

  7. 是什么让spring 5放弃了使用Guava Cache?

    一路走来,Spring社区从刚开始的核心模块一直发展到现在,最近Sping5也完成了M5的发布, 相信不久之后第一个RELEASE版本也会发布.里面有很多特性是和即将要发布的JAVA 9息息相关的.今 ...

  8. guava cache与spring集成

    缓存的背景 缓存,在我们日常开发中是必不可少的一种解决性能问题的方法.简单的说,cache 就是为了提升系统性能而开辟的一块内存空间.在cpu进行计算的时候, 首先是读取寄存器,然后内存,再是硬盘.由 ...

  9. 第七章 企业项目开发--本地缓存guava cache

    1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...

随机推荐

  1. IaaS中的统一存储:从设计到实现

    转自:https://www.ustack.com/blog/tycc/ “原生的OpenStack并不支持统一存储,云主机服务Nova.镜像服务Glance.云硬盘服务Cinder的后端存储各不相同 ...

  2. 使用smart-npm和npm安装完毕之后发现 不是内部命令和外部命令!

    我明明记得加入过path环境变量.我想一定是什么原因 一查bing.com然后发现没有在全局环境  .所以 只需要过npm install -g gulp 一句执行cmd这样就好 $ gulp提示gu ...

  3. 1 Python 环境搭建

    Python可应用于多平台包括 Linux 和 Mac OS X. 你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本. U ...

  4. BEC translation exercise 1

    U.S. oil drillers have made major efficiency improvements with a speed that has repeatedly surprised ...

  5. UVALive - 5031 Graph and Queries (并查集+平衡树/线段树)

    给定一个图,支持三种操作: 1.删除一条边 2.查询与x结点相连的第k大的结点 3.修改x结点的权值 解法:离线倒序操作,平衡树or线段树维护连通块中的所有结点信息,加个合并操作就行了. 感觉线段树要 ...

  6. Eclipse中Maven配置操作

    1.修改为自己的maven路径 2.对应的自己的仓库设置

  7. eShopOnWeb

    eShopOnWeb https://www.cnblogs.com/sheng-jie/p/9616675.html 构建现代Web应用 1.引言 eShopOnWeb是基于ASP.NET Core ...

  8. Audiophobia(Floyd算法)

    个人心得:这在一定途径上完成查询方面还是很吃力,得多锻炼空间能力,不能再每次都看到就后退,要全力应对, 那怕被虐的不要不要的. 这题主要是求俩个端点中所有路径中最大构成的集合中最小的数值,其实开始思想 ...

  9. LeetCode 251. Flatten 2D Vector

    原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...

  10. ugui在运行时改变RectTransform的大小

    http://blog.csdn.net/BeiFuDeNvWang/article/details/50838266 在代码中动态改变RectTransform大小的方法如下所示: 1:直接对siz ...