摘要: 学习Google内部使用的工具包Guava,在Java项目中轻松地增加缓存,提高程序获取数据的效率。 一、什么是缓存?...//设置2分钟没有获取将会移除数据 expireAfterAccess(2, TimeUnit.MINUTES)....expireAfterAccess(2, TimeUnit.MINUTES)....六、总结回顾 缓存加载:CacheLoader、Callable、显示插入(put) 缓存回收:LRU,定时(expireAfterAccess,expireAfterWrite),软弱引用,显示删除...刷新:主动刷新方法LoadingCache.referesh(K) 信息统计:CacheBuilder.recordStats() 开启Guava Cache的统计功能。
一、概述 guava⽬前有三种刷新本地缓存的机制: expireAfterAccess:当缓存项在指定的时间段内没有被读或写就会被回收。...expireAfterWrite:当缓存项在指定的时间段内没有更新就会被回收。-- 常用 refreshAfterWrite:当缓存项上一次更新操作之后的多久会被刷新。...-- 常用 二、原理 expireAfterWrite 为了避免缓存雪崩,guava 会限制只有一个加载操作时进行加锁,其他请求必须阻塞等待这个加载操作完成。...refreshAfterWrite 当缓存项上一次更新操作之后的多久会被刷新。...三、实践 首先了解⼀个机制,guava 不会⾃动清除清除数据,只有在访问时候再去判断 expire。
Google开源的Java重用工具集库Guava里的一款缓存工具,实现的缓存功能: 自动将entry节点加载进缓存结构 当缓存的数据超过设置的最大值时,使用LRU算法移除 具备根据entry节点上次被访问或者写入时间计算它的过期机制...缓存的key被封装在WeakReference引用内 缓存的Value被封装在WeakReference或SoftReference引用内 统计缓存使用过程中命中率、异常率、未命中率等统计数据 Guava...writeQueue) ReferenceEntry可以是强引用类型的key,也可以WeakReference类型的key,为了减少内存使用量,还可以根据是否配置了expireAfterWrite、expireAfterAccess...,但如果长时间没有调用方法的话,会导致不能及时的清理释放内存空间的问题 evict主要处理四个Queue:1. keyReferenceQueue;2. valueReferenceQueue;3....: 从缓存中取key的值,如果该值已经缓存过了则返回缓存中的值,如果没有缓存过可以通过某个方法来获取这个值。
Guava Cache 介绍 ---- Guava Cache 是 google guava 中的一个内存缓存模块,用于将数据缓存到 JVM 内存中。...缓存中存放的数据总量不会超出内存容量。 Guava Cache 是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。 2....工具简单使用 ---- 1. pom.xml 文件中添加依赖 com.google.guava guava...@Override public String toString() { return userId + " --- " + userName; } } 3. guava...) // 设置缓存容器的初始容量为 10 .initialCapacity(10) // 设置缓存最大容量为
谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问。 ?...Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。如果不符合需求,可以选择Memcached、Redis等工具。 小案例 pom.xml添加guava依赖 1.1.0 com.google.guava... guava 27.0.1-jre...第一次循环时缓存中没有数据,构建了缓存,第二次直接命中缓存。如果程序需要单机内存缓存,可以用该方式构建缓存。
在项目中用到的除了分布式缓存,还有本地缓存,例如:Guava、Encache,使用本地缓存能够很大程度上提升程序性能,本地缓存是直接从本地内存中读取,没有网络开销。...简介 Caffeine是基于Java8 的高性能缓存库,借鉴了 Guava 和 ConcurrentLinkedHashMap 的设计经验,拥有更高的缓存命中率和更快的读写速度。...性能比Guava更强 功能特性 基于时间的回收策略:包括写入时间和访问时间 基于容量的回收策略:一种是基于容量大小,一种是基于权重大小,两者只能取其一。....build(); } } 这种方式的弊端是所有的缓存都放在一起,最好的使用方式是每一个缓存单独创建缓存对象。...,无论读还是写的效率都远高于其他缓存,从 Spring5 开始的默认缓存实现就将 Caffeine 代替原来的Google Guava,支持多种回收策略,感兴趣的小伙伴赶快去试试吧~
如:put数据时,先插入DB,再删除原来的缓存;ge数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中 。如果访问量大,我们还得兼顾本地缓存的线程安全问题。...必要的时候也要考虑缓存的回收策略。 今天说的 Guava Cache 是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。...他很好的解决了上面提到的几个问题: 很好的封装了get、put操作,能够集成数据源 ; 线程安全的缓存,与ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能显示的移除元素; Guava...可选配置分析 缓存的并发级别 Guava提供了设置并发级别的api,使得缓存支持并发的写入和读取。同 ConcurrentHashMap 类似Guava cache的并发也是通过分离锁实现。...基于存活时间的清除 expireAfterWrite 写缓存后多久过期 expireAfterAccess 读写缓存后多久过期 refreshAfterWrite 写入数据后多久过期,只阻塞当前数据加载线程
说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。...我们就来介绍一个比Guava Cache性能更高的缓存框架:Caffeine。...maximumSize: 缓存的最大数量 maximumWeight: 缓存的最大权重 expireAfterAccess: 最后一次读或写操作后经过指定时间过期 expireAfterWrite:...java金融 java金融 null expireAfterAccess 在最后一次读或者写入后开始计时,在指定的时间后过期。假如一直有请求访问该key,那么这个缓存将一直不会过期。...这里和expireAfterAccess、expireAfterAccess不同的是,需要你告诉缓存框架,他应该在具体的某个时间过期,获取具体的过期时间。
说起Guava Cache,很多人都不会陌生,它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU算法实现,支持多种缓存过期策略。...我们就来介绍一个比Guava Cache性能更高的缓存框架:Caffeine。...maximumSize: 缓存的最大数量 maximumWeight: 缓存的最大权重 expireAfterAccess: 最后一次读或写操作后经过指定时间过期 expireAfterWrite:...注意这个是和expireAfterAccess、expireAfterAccess是互斥的。...这里和expireAfterAccess、expireAfterAccess不同的是,需要你告诉缓存框架,他应该在具体的某个时间过期,获取具体的过期时间。
guava cache的缓存结构 常用的guava cache缓存 根据上图中的缓存框架,我们常用的一些缓存实例有:LocalManualCache和LocalLoadingCache,两者唯一的区别就是...// expireAfterWrite 缓存加载指定时间后,自动失效 // maximumSize 缓存数量超出指定数量后,加载新的缓存,会根据指定策略淘汰老的缓存 //...因此在load的时候,我们返回对象前必须处理null的问题。 Cache为什么不能返回null 先不说为什么不可以返回null,先假设cache可以接收null值。...不能通过get的valuenull,来判断加载的时机,只能通过containsKey来判断,如果通过valuenull作为是否加载缓存的标准,就会产生一个问题,如果缓存的是null,那么即使加载过一次,...; this.name = name; } public String getName(){ return this.name; } } 更多的guava
导语: Guava 作为Google开源Java 库中的精品成员,在性能、功能上都十分出色,本文将从实际使用的角度,来对Guava进行讲解 在使用Cache之前,首先要考虑两个问题: 1、应该在什么情况下使用它...3、在高并发情况下、能够正常缓存的更新以及返回。 带着这几个问题,来开始介绍Guava Cache这一趁手兵器。...2、缓存更新的策略: 根据时间 expireAfterWrite 缓存写入后多久过期。 expireAfterAccess 缓存读取后多久过期。...image.png ========================================================== 下面一起聊下使用缓存时会遇到的问题,以及Guava Cache...futureValue : fullyFailedFuture(t); } } Guava Cache 这种异步刷新缓存的方式是作者个人比较倾向的使用姿势,但是这里也有一个问题,缓存不会主动刷新的
并且在 spring5 (springboot 2.x) 后,spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默认缓存组件。...Caffeine是在Guava Cache的基础上做一层封装,性能有明显提高,二者同属于内存级本地缓存。...使用Caffeine后无需使用Guava Cache,从并发的角度来讲,Caffeine明显优于Guava,原因是使用了Java 8最新的StampedLock锁技术。...maximumSize 缓存的最大条数maximumWeight 缓存的最大权重expireAfterAccess 最后一次写入或访问后,经过固定时间过期expireAfterWrite 最后一次写入后...立即失效方面,Guava会把立即失效 (例如:expireAfterAccess(0) and expireAfterWrite(0)) 转成设置最大Size为0。
项目中经常使用Guava Cache,根据经验总结了一些最佳实践。...,防止OOM .maximumSize(1000) //提供过期策略 .expireAfterAccess(100, TimeUnit.MINUTES)...//限制缓存大小,防止OOM .maximumSize(1000) //提供过期策略 .expireAfterAccess(100, TimeUnit.MINUTES) 上面是使用得最多的两个选项,其他选项还有...,不会阻塞线程获取缓存内容(老的内容) GauvaCache不支持缓存null值 参考 Guava LoadingCache不能缓存null值 How to avoid caching when values...走近Guava(五): 缓存 Guava Cache -- Java 应用缓存神器
guava依赖 com.google.guava guava...23.6-jre guava cache 高并发三件套之一,缓存 场景: 有个场景,接口请求获取数据频繁,但数据改动量小,一般情况是先去...是不是觉得挺麻烦的,这时候就用到guava cache了,guava封装看以上流程,只需直接调用get即可 GuavaCache提供了三种基本的缓存回收方式: 基于容量回收、定时回收和基于引用回收。...那么这个时候就会产生问题了,我们如何能控制好程序发送短信时的速度昵?于是限流器就得用上了。 2....提供服务接口的人或多或少遇到这样的问题,业务负载能力有限,为了防止过多请求涌入造成系统崩溃,如何进行流量控制? 流量控制策略有:分流,降级,限流等。
利用这类缓存足以解决大多数的性能问题了,我们也要知道,这种属于remote cache(分布式缓存),应用的进程和缓存的进程通常分布在不同的服务器上,不同进程之间通过RPC或HTTP的方式通信。...常用的本地缓存方案有:Guava CacheCaffeineEhCache基于Guava Cache实现本地缓存Guava是Google团队开源的一款 Java 核心增强库,包含集合、并发原语、缓存、IO...) //设置读写缓存后n秒钟过期,实际很少用到,类似于expireAfterWrite //.expireAfterAccess(17, TimeUnit.SECONDS...) //设置读写缓存后n秒钟过期,实际很少用到,类似于expireAfterWrite //.expireAfterAccess(17, TimeUnit.SECONDS...注意的这里的关键字进程,基于进程的缓存直觉告诉我们效率肯定要高一些,因为它直接在进程之内进行操作,但不同应用之间缓存的共享可能就会有问题。
一: 什么是Guava Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives...//Guava Cache的使用 LoadingCache graphs = CacheBuilder.newBuilder() .expireAfterAccess...缓存中存放的数据总量不会超出内存容量。(Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。...在pom文件中引入Guava Cache的坐标: com.google.guava guava</...3, 基于引用的回收(Reference-based Eviction) 通过使用弱引用的键、或弱引用的值、或软引用的值,Guava Cache可以把缓存设置为允许垃圾回收: CacheBuilder.weakKeys
今天,我们主要介绍一款非常流行的本地缓存框架 —— Guava缓存 什么是 Guava Guava 是 Google 开发的一款java 开源框架。...项目集成 在 pom.xml 文件引入相应的二方包依赖 com.google.guava guava...() .concurrencyLevel(8) .expireAfterWrite(5, TimeUnit.SECONDS) .expireAfterAccess...} ); } 参数解释: expireAfterWrite 指定key在一定时间内没有创建/覆盖时,会移除该key,下次取的时候从loading中取 expireAfterAccess...Guava 缓存失效的方法: invalidate(key):废弃缓存中 key对应的 value值。 invalidateAll():废弃缓存中所有的value值。
如果不考虑高并发情况下的数据安全问题,可以选择HashMap。它是非线程安全的,但在单线程或低并发环境下性能较好。...如果需要考虑高并发情况下的数据安全问题,可以选择Hashtable或ConcurrentHashMap。Hashtable是线程安全的,但性能相对较差。...Guava Cache(也称为Guava缓存)是Google开源的一个Java库,用于实现本地缓存。它是Guava项目的一部分,是Google对Java集合框架的扩展和增强。...maximumSize 缓存的最大条数 maximumWeight 缓存的最大权重 expireAfterAccess 最后一次写入或访问后,经过固定时间过期 expireAfterWrite 最后一次写入后...立即失效方面,Guava会把立即失效 (例如:expireAfterAccess(0) and expireAfterWrite(0)) 转成设置最大Size为0。
Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。...相对地, Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。...LoadingCache cahceBuilder=CacheBuilder .newBuilder().maximumSize(10000).expireAfterAccess...cahceBuilder.get("2"); } Callable缓存的实现 所有类型的Guava Cache,不管有没有自动加载功能,都支持get(K, Callable...Cache cache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterAccess(10, TimeUnit.MINUTES
、LinkedHashMap、TreeMap、LinkedTreeMap、ConcurrentHashMap… 总有一个满足你 这样实现很简单,但是也致命缺点:无法回收不常用的缓存 Guava Cache...说起 Guava, 很多人都不会陌生,它是 Google 提供的一个非常好用的 Java 工具包。...Guava Cache 是 Guava 中的一个本地缓存实现,基于LRU算法实现,并提供了多种缓存过期策略,过期时间、容量等....在本地缓存方面,SpringFramework5.0(SpringBoot2.0)放弃了Google的GuavaCache,选择了「Caffeine」(Drop Guava caching - superseded...注意事项 在使用缓存的过程中,我们还要注意缓存不一致、缓存穿透、缓存击穿与缓存雪崩等问题,每种问题都是不小的问题 这篇写的并不长,每种都是简单介绍了一下,马上分几篇分别介绍一下各自的具体使用方法,敬请期待
领取专属 10元无门槛券
手把手带您无忧上云