Guava Cache本地缓存
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() 一定要关注这个点。
相关链接
Guava Cache本地缓存的更多相关文章
- Guava Cache 本地缓存组件浅析
cache组件中核心的类和接口列举如下: 接口: Cache 本地缓存的顶级接口,提供一些对缓存进行get,put的方法,以及获取缓存统计数据的方法等. LoadingCache 继承了Cache接口 ...
- Guava Cache,Java本地内存缓存使用实践
Guava Cache,网上介绍很多,我就不赘述了. 分享一篇好的文章: Guava Cache内存缓存使用实践-定时异步刷新及简单抽象封装 Google Guava 3-缓存 在原作者基础上,我做了 ...
- springboot之本地缓存(guava与caffeine)
1. 场景描述 因项目要使用本地缓存,具体为啥不用redis等,就不讨论,记录下过程,希望能帮到需要的朋友. 2.解决方案 2.1 使用google的guava作为本地缓存 初步的想法是使用googl ...
- 本地缓存google.guava及分布式缓存redis 随笔
近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...
- Guava的两种本地缓存策略
Guava的两种缓存策略 缓存在很多场景下都需要使用,如果电商网站的商品类别的查询,订单查询,用户基本信息的查询等等,针对这种读多写少的业务,都可以考虑使用到缓存.在一般的缓存系统中,除了分布式缓存, ...
- 同时使用Redis缓存和Google Guava本地缓存注意事项(深拷贝和浅拷贝)
目录 1.问题场景及说明 2.Redis 缓存是深拷贝 3.Guava本地缓存直接获取则是浅拷贝 4.如何实现Guava获取本地缓存是深拷贝? 1.问题场景及说明 系统中同时使用 Redis 缓存和 ...
- 是什么让spring 5放弃了使用Guava Cache?
一路走来,Spring社区从刚开始的核心模块一直发展到现在,最近Sping5也完成了M5的发布, 相信不久之后第一个RELEASE版本也会发布.里面有很多特性是和即将要发布的JAVA 9息息相关的.今 ...
- guava cache与spring集成
缓存的背景 缓存,在我们日常开发中是必不可少的一种解决性能问题的方法.简单的说,cache 就是为了提升系统性能而开辟的一块内存空间.在cpu进行计算的时候, 首先是读取寄存器,然后内存,再是硬盘.由 ...
- 第七章 企业项目开发--本地缓存guava cache
1.在实际项目开发中,会使用到很多缓存技术,而且数据库的设计一般也会依赖于有缓存的情况下设计. 常用的缓存分两种:本地缓存和分布式缓存. 常用的本地缓存是guava cache,本章主要介绍guava ...
随机推荐
- 1008 Envy(好题¥)
1008: Envy 时间限制: 1 Sec 内存限制: 128 MB提交: 288 解决: 61[提交][状态][讨论版] 题目描述 今年的 ACM 比赛推出了一个赛后的娱乐活动,所有参赛选手排 ...
- mysql分组取topn
本文来自 http://www.jb51.net/article/31590.htm 有些语句sql top n 是sqlserver语法 --按某一字段分组取最大(小)值所在行的数据 代码如下: ...
- ImageSwitcher的简单使用
测试代码: activity_main.xml: <?xml version="1.0" encoding="utf-8"?> <Linear ...
- Codeforces Round #262 (Div. 2)C(二分答案,延迟标记)
这是最大化最小值的一类问题,这类问题通常用二分法枚举答案就行了. 二分答案时,先确定答案肯定在哪个区间内.然后二分判断,关键在于怎么判断每次枚举的这个答案行不行. 我是用a[i]数组表示初始时花的高度 ...
- HDU3518Boring counting(后缀自动机)
Problem Description 035 now faced a tough problem,his english teacher gives him a string,which consi ...
- New Year and Buggy Bot
Bob programmed a robot to navigate through a 2d maze. The maze has some obstacles. Empty cells are d ...
- Audiophobia(Floyd算法)
个人心得:这在一定途径上完成查询方面还是很吃力,得多锻炼空间能力,不能再每次都看到就后退,要全力应对, 那怕被虐的不要不要的. 这题主要是求俩个端点中所有路径中最大构成的集合中最小的数值,其实开始思想 ...
- Zabbix通过SNMPv2监控DELL服务器的硬件信息
(一)zabbix监控DELL服务器 (1)简述:监控DELL服务器硬件一般有两种途径:1.操作系统上安装OMSA,编写脚本调用omreport命令进行监控(需要在操作系统上安装比较麻烦):2.使用i ...
- java中static的学习
1.static引入: 通常来说,当创建一个类是,就是在描述那个类的对象的外观与行为.除非用new创建那个类的对象,否则实际并未获取任何对象.当执行new来创建对象时,数据存储空间才被分配,七方法才供 ...
- lrzsz-串口传输文件
二.编译安装 1.解压文件,进入目录 tar –zxvf lrzsz-0.12.20.tar.bz cd / lrzsz-0.12.20 ./configure 2../con ...