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. 1009 失恋的小 T(后缀数组¥)

    1009: 失恋的小 T 时间限制: 1 Sec  内存限制: 128 MB提交: 160  解决: 76[提交][状态][讨论版] 题目描述 小 T 最近失恋了,开始怀疑人生和爱情,他想知道在这世界 ...

  2. ural 2022 Riding a Toad

    2022. Riding a Toad Time limit: 1.0 secondMemory limit: 64 MB A tribe of leafmen live in the old for ...

  3. MySQL 索引的知识整理

    前言:       很多面试者,在面试的时候,都会回答,”索引就相当于一本书的字典,有了他能够很快的找到数据”, 这种答案好像在读书的时候老师告诉这么说的吧.今天来全面的描述一下数据库索引的原理及优化 ...

  4. Sublime2 + SASS + Koala 测试

    Sublime SASS语法高亮插件下载地址:https://github.com/kuroir/SCSS.tmbundle/zipball/SublimeText2 koala_2.0.4_setu ...

  5. python虚拟开发环境搭建(virtualenv和virtualenvwrapper)

    虚拟开发环境的搭建 (0) 搭建虚拟环境的意义 使不同的开发环境独立 环境升级不影响其他开发环境,也不影响全局 防止包管理的混乱 (1) 指定 虚拟环境的创建目录 环境变量设置 创建 WORKON_H ...

  6. 学习动态性能表(10)--v$session_longops

    学习动态性能表 第十篇--V$SESSION_LONGOPS  2007.6.7 本视图显示运行超过6秒的操作的状态.包括备份,恢复,统计信息收集,查询等等. 要监控查询执行进展状况,你必须使用cos ...

  7. RabbitMQ在windows环境下的安装

    最近一直想入手一台电脑,作为linux服务器,由于经济状况也没有入手,现在就先介绍windows环境下安装rabbitMQ. RabbitMQ是什么 ? RabbitMQ是一个在AMQP基础上完整的, ...

  8. Visualforce入门第六篇_2017.3.1

    Visualforce实现过滤.数据列表显示.分页功能 可以参考salesforce官网开发文档:https://trailhead.salesforce.com/modules/visualforc ...

  9. python 修改文件内容

    python 修改文件内容 一.修改原文件方式 1 def alter(file,old_str,new_str): 2 """ 3 替换文件中的字符串 4 :param ...

  10. C# 保护进程不被结束(源代码)防任务管理器结束进程

    C# 保护进程不被结束(源代码)防任务管理器结束进程 Posted on 2013-03-25 16:03 快乐家++ 阅读(3173) 评论(3) 编辑 收藏 闲来无事,英语又学的太痛苦.看到我妈妈 ...