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. hdu 2149 Public Sale(bash)

    Public Sale Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. 51nod 1267 二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 1267 4个数和为0 基准时间限制:1 秒 空间限制:13107 ...

  3. AppCompatActivity和Activity的区别

    1-首先是AppCompatActivity默认带标题,但Activity不带 2-而且AppCompatActivity和 requestWindowFeature(Window.FEATURE_N ...

  4. mosquitto配置文件说明

    安装完成之后,所有配置文件会被放置于/etc/mosquitto/目录下,其中最重要的就是Mosquitto的配置文件,即mosquitto.conf,以下是详细的配置参数说明. # ======== ...

  5. L118

    The company needs to focus on its biggest clients.This article discussed the events that led to her ...

  6. python any函数

    pyhton的any() 函数: 判断给定的可迭代参数 iterable : 全部为 False,返回 False; 至少有一个为 True,则返回 True. 元素除了是 0.空.FALSE 外都算 ...

  7. C8051F340 USB Fn hacking

    /************************************************************************************ * C8051F340 US ...

  8. mvc那些事

    mvc的特点: 1.无控件,有HtmlHelper类,此类提供了各种生成html控件的方法.如果不能满足需要,就自定义扩展吧,比如说分页显示.HtmlHelper类提供了Partial(加载局部视图) ...

  9. Redis底层探秘(二):链表和跳跃表

    链表简介 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地跳转链表的长度. 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用C语言并没有内 ...

  10. 使用bat文件实现批量重命名功能

    在生活中我们总会碰到对大量文件进行重命名操作,这时如果一个一个的,选取文件→右键→重命名→选取文件,这样操作势必会浪费大量时间. 现在小编就告诉大家一个使用bat文件(命令行)的方法,快速对文件进行重 ...