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;@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本地缓存相关推荐
- Guava Cache本地缓存在 Spring Boot应用中的实践
概述 在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小.而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是 ...
- 基于guava实现本地缓存
package com.daojia.service.djwechat.utils;import com.google.common.cache.Cache; import com.google.co ...
- Guava CacheBuilder 本地缓存的使用
目录 前言 CacheBuilder代码截图 使用示例代码举例 CacheLoader加载 缓存回收 基于容量的回收(size-based eviction) 定时回收(Timed Eviction) ...
- Google Guava Cache--localcache本地缓存实例
何为缓存?本地缓存类似于map,当给定一个key,首先查找缓存中是否已经有值了,如果有则直接返回数据:相反如果不存在这样的key,则将新的内容value值缓存起来,以便下一次来查询,可以快速返回. 当 ...
- 重新认识下JVM级别的本地缓存框架Guava Cache——优秀从何而来
Guava Cache初识 Guava是Google提供的一套JAVA的工具包,而Guava Cache则是该工具包中提供的一套完善的JVM级别的高并发缓存框架.其实现机制类似ConcurrentHa ...
- 3. java缓存-线程内缓存guava cache
guava cache的缓存结构 常用的guava cache缓存 根据上图中的缓存框架,我们常用的一些缓存实例有:LocalManualCache和LocalLoadingCache,两者唯一的区别 ...
- Guava Cache 如何防止缓存击穿
GuavaCache基本用法 如果我们需要对从db获取的数据增加本地缓存,缓存10s过期,用guava cache很简单: 初始化一个Cache对象,定义load方法,或者在获取值的时候传一个load ...
- 万字详解本地缓存之王 Caffeine
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自:r6d.cn/UXR4 概要 Caffeine[1] ...
- 是什么让 Spring5 放弃了使用 Guava Cache?
来源:https://albenw.github.io/posts/a4ae1aa2/ 概要 Caffeine是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是Gu ...
- 基于LRU-K算法设计本地缓存实现流量削峰
1.背景介绍 1.1.现象 QPS突然增长2倍以上(45w~60w每分钟) 将产生下面一些问题: 1)响应接口响应时长增加了5倍(qps增加了2倍): 2)机房局域网交换机带宽报警(1kM带宽使用了9 ...
最新文章
- VUE 动态绑定class
- 现代化医学信息管理c语言,山西医科大学_院校信息库_阳光高考
- 【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | 引入线程安全概念 )
- 如何更改已生成的APK的APP名字?
- Java中ListE对象赋值问题(引用传递和值传递)
- k8s 给worker/master节点打标签(角色标签)
- hexo的yelee主题本地搜索故障
- Java 内存 关系_发生在Java内存模型中的关系之前
- 设置环境变量ANDROID_SDK_HOME有什么用?
- 容器编排技术 -- Kubernetes kubectl create secret generic 命令详解
- 零基础转行学习python是否还在纠结?这里告诉你答案!
- 微信又上线新功能,能让你更会聊天?
- kvm虚拟化学习笔记(十)之kvm虚拟机快照备份
- grub引导U盘(集成常用工具/深山红叶PE工具箱V30/完美者U盘维护系统V8.1)
- SQL Server里的闩锁介绍
- Oracle物化视图的一般使用【转】
- 房地产大数据分析方法
- SubmitButton
- Fair Resource Allocation in Federated Learning
- 在 Jenkins 上轻松重用 Tekton 和 Jenkins X
热门文章
- [swift 进阶]读书笔记-C2P3_Set、 C2P4_Range
- 源码安装MySQL步骤
- [saiku] JCR在saiku中的运用原理
- 1年内从2000涨到13000的成长经验分享
- AMD Fusion 开发者峰会透漏的信息
- 2004-6-22+ 用vs.net做的留言板
- android依赖alert样式,Android - AlertDialog样式
- 全国最优秀的计算机学校,2020全国最好的计算机专业学校排名
- scrcpy能显示不能控制
- SpringMVC的RESTful(一)