例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。 Guava Cache与ConcurrentMap很相似,但也不完全一样。...进一步说,asMap视图的原子运算在Guava Cache的原子加载范畴之外,所以相比于Cache.asMap().putIfAbsent(K, V),Cache.get(K, Callable) 应该总是优先使用...基于引用的回收(Reference-based Eviction) 通过使用弱引用的键、或弱引用的值、或软引用的值,Guava Cache可以把缓存设置为允许垃圾回收 通过使用弱引用的键、或弱引用的值、...或软引用的值,Guava Cache可以把缓存设置为允许垃圾回收: CacheBuilder.weakKeys():使用弱引用存储键。...如上所述,Guava Cache在某种意义上支持中断。
需要事先说明的是,我没有阅读过 Guava Cache 的源码,对其的介绍仅仅是一些使用经验或者最佳实践,不会有过多深入的解析。...(可以类比 ConcurrentHashMap) 提供常用的缓存过期策略,缓存刷新策略 提供缓存命中率的监控 基础使用 使用一个示例介绍 Guava Cache 的基础使用方法 -- 缓存大小写转换的返回值...总结 本文介绍了 Guava Cache 一些常用的 API 、用法示例,以及需要警惕的一些使用误区。...总之非常灵活,使用 Guava Cache 的 API 可以满足大多数业务场景的缓存需求。 为什么是 Guava Cache,它的性能怎么样?...我现在主要是出于稳定性考虑,项目一直在使用 Guava Cache。据说有比 Guava Cache 快的本地缓存,但那点性能我的系统不是特别关心。 - END -
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式。类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache....配置缓存 这里采用guava cache作为本地缓存。将guava cache注册到cacheManger里就可以调用了。 1.配置cacheManger 首先针对要缓存的类型,配置缓存策略。..., Caffeine, Guava caches and JSR-107 compliant caches (e.g....比如DK java.util.concurrent.ConcurrentMap based caches, Ehcache 2.x, Gemfire cache, Caffeine, Guava caches...默认的Cache Resolution Out of the box, 缓存代理使用简单的CacheResolver来获取cache, 这个是可以使用CacheManager来手动配置的。
根据科普中国的定义,缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。...在这里,我们借用了硬件缓存的概念,当在Java程序中计算或查询数据的代价很高,并且对同样的计算或查询条件需要不止一次获取数据的时候,就应当考虑使用缓存。...目前有三种删除数据的方式,分别是:FIFO(先进先出)、LFU(定期淘汰最少使用次数)、LRU(淘汰最长时间未被使用)。...由于特定的工作流程,使用者必须在创建Cache或者获取数据时指定不存在数据时应当怎么获取数据。...Man{id='001', name='张三'} 使用loadingCache getIfPresent方法 第一次加载 null 使用loadingCache get方法 第一次加载 LoadingCache
简单从这几个方面描述一下如何使用Cache,对Cache的各种原理介绍此处不涉及. 1.使用场景 2.如何使用Cache 3.创建方式 4....Cache的使用场景 一般而言,对于那些频繁需要查询比对的热点数据,我们采用使用缓存,对于数据量较小的,几条,几十条数据,而且需要加缓存的接口较少,这时候我们会采用Cache,建议使用Google...提供的guava Cache,它简单易用的同时,性能也好....如何使用Cache 和Map的使用方式差不多,也可以和Spring结合,使用@Cacheable注解使用. 3. 创建方式 1. Cache Callable 2....地址:https://github.com/raphw/guava-cache-overflow-extension
Guava -- 集合类 和 Guava Caches 1....依赖 使用 guava 非常简单,可以直接通过 maven 导入依赖: com.google.guava <artifactId...查询 or 保存数据 使用 get 方法将数据存入本地缓存中或查询数据。 Cache的get方法有两个参数,第一个参数是要从Cache中获取记录的key,第二个记录是一个Callable对象。...可以使用 getall() 方法批量查询 3. 缓存失效 guava 使缓存失效的方法 invalidate(key):废弃缓存中当前key对应的所有value值。...5. asMap 方法 在任何Cache上使用asMap以ConcurrentMap视图查看缓存。
public class GuavaCacheDemo { private Cache cache; private LoadingCache<String,Man...notification.getCause()); //EXPLICIT、REPLACED、COLLECTED、EXPIRED、SIZE }}; //可以使用...invalidate,invalidateAll) 监听器:CacheBuilder.removalListener(RemovalListener) 清理缓存时间:只有在获取数据时才或清理缓存LRU,使用者可以单起线程采用...刷新:主动刷新方法LoadingCache.referesh(K) 信息统计:CacheBuilder.recordStats() 开启Guava Cache的统计功能。...我认为在缓存数据有很多种类的时候采用第一种cache。而数据单一,数据库数据会定时刷新时采用第二种cache。
ReferenceEntry ReferenceEntry是guava-cache中实际进行存储的数据结构,其类图: 那么在初始状态下,每个Segment中有多少个ReferenceEntry呢?...ReHash guava cache采用了和ConcurrentHashMap同样的算法。...cache也是采用链表的形式解决hash冲突的。...cache扩容仍然采用了ConcurrentHashMap的思想。...高并发下数据写入与过期 总结 Guava cache其实是在ConcurrentHashMap的基础上加入了过期、权重、自动刷新等特性。
项目中经常使用Guava Cache,根据经验总结了一些最佳实践。...evicted because of size in guava cache: {}", notification.getKey()); break; case...model evicted because of explicit in guava cache: {}", notification.getKey()); break;...case REPLACED: log.info("model updated because of replaced in guava cache: {}", notification.getKey...走近Guava(五): 缓存 Guava Cache -- Java 应用缓存神器
摘要: 学习Google内部使用的工具包Guava,在Java项目中轻松地增加缓存,提高程序获取数据的效率。 一、什么是缓存?...由于特定的工作流程,使用者必须在创建Cache或者获取数据时指定不存在数据时应当怎么获取数据。...四、GuavaCache使用Demo 4.1 简单使用 有人说我就想简简单单的使用cache,就像Map那样方便就行。接下来展示一段简单的使用方式。...demo中,分别采用了Guava自带的两个Cache:LocalLoadingCache和LocalManualCache。...刷新:主动刷新方法LoadingCache.referesh(K) 信息统计:CacheBuilder.recordStats() 开启Guava Cache的统计功能。
在 java 环境下,最常见的一种开源缓存框架要数 guava cache 了。简单的配置与优秀的性能,让它得到了广大 java 程序员的青睐。...2. guava cache 的使用 guava cache 的使用非常简单,下面是一个 sample: LoadingCache cache = CacheBuilder.newBuilder...3.2 使用方法 上面的示例中,我们在构建 guava cache 时,CacheBuilder 的 build 方法传入的参数是一个 CacheLoader 对象,并且实现了 load 方法。...cache 通过 load 方法获取数据,而当缓存中存在数据但已失效后,guava cache 则改为通过 reload 方法获取数据。...那么,guava cache 是如何做到上述机制的呢?敬请期待下一篇文章,让我来深入 guava cache 的源码,详细为您解读。
背景 上一篇文章中,我们详细介绍了 guava cache 的使用方法,尤其是在其中重点介绍了 guava cache 异步回种的用法,那么,性能优异的异步回种缓存究竟是如何实现的呢?...本文我们就来详细阅读 guava cache 的完整流程代码,抽丝剥茧,学习其中的思想与智慧。 guava cache 用法详解 2....基本思想 guava cache 异步回种基本思想: cache.get() 完整流程图: 3....guava cache 在上述情况下调用 lockedGetOrLoad() 方法获取数据,这个方法中,通过加 AQS 锁避免多个线程同时 load 获取数据,然后通过回调 load() 方法同步获取数据...总结 了解了 guava cache 异步回种的基本思想,也许你会觉得这一套解决方案的实现是如此简单,那么,我们知道,memcache、redis 都是只有提供了同步接口的,那么,你是否可以在此基础上实现一套异步回种方案呢
* 在Raft中,任何时候一个服务器可以扮演下面角色之一: Leader: 处理所有客户端交互,日志复制等,一般一次只有一个Leader. Follower:...
姿势一 使用expiredAferWriter 优点 简单 粗暴 缺点 同步阻塞问题:如果多个线程同时请求同一个过期的key,只有一个线程能够获得去加载缓存的锁,但是其他未获取加载缓存锁的线程也会阻塞。...---- 姿势二 使用expiredAfterWrite + refreshAfterWrite 使用注意 指定refreshAferWrite的时间小于expiredAfterWrite 必须使用LoadingCache...直接使用get获取缓存 优点 当到达刷新时间之后,只会有一个线程获得刷新缓存的锁,其他线程直接返回缓存中的旧值,仅阻塞刷新缓存的线程 缺点 刷新缓存的线程还是会被阻塞 show me the code...使用姿势二和三要注意缓存的刷新过期时间要设置的比加载过期时间短,否则体现不出优势 3....具体逻辑参照**com.google.common.cache.LocalCache$Segment**。这里贴出一些关键逻辑供各位参考: ? 只有在value!
1. guava cache的实现 这里我们主要介绍LoadingCache,对于LoadingCache主要有: ForwardingLoadingCache 需要自己设置一个代理的LoadingCache...使用cache 1....设置缓存的后台刷新 使用com.google.common.cache.CacheLoader#asyncReloading方法创建CacheLoader: public static CacheLoader...自己实现CacheLoader的时候,同时实现reload方法,给这个reload方法一个Executor线程(如果多处使用,可以使用只有一个线程的池)。...参考江南白衣的博客:http://calvin1978.blogcn.com/articles/guava-cache%E5%B0%8F%E8%AE%B0.html
今天,听同事介绍了Cuava-cache,这是个老牌缓存了,虽然近来被Caffine的出现遮盖了风头,但依然不能掩盖它往日的辉煌,至少在我们团队,还有很多项目在使用它,索性就以它为基础,对缓存做一次总结...缓存使用模式 Cache-Aside 即业务代码围绕缓存来写,由业务代码直接维护缓存; Cache-As-SoR 即把Cache看做 SoR,所有操作都是对Cache进行,然后Cache再委托给SoR进行真实的读...使用Read-Through 模式,需要配置一个CacheLoader组件用来回源到SoR加载源数据.Guava Cache和Ehcache 3.x都支持该模式,下面会有实现; ② write-through...Guava-Cache简单实现 public class CacheTest { static AtomicInteger ac = new AtomicInteger(1); public...statsCounter.recordMisses(1); } } else { return waitForLoadingValue(e, key, valueReference); } } 这是Guava-Cache
Google开源的Java重用工具集库Guava里的一款缓存工具,实现的缓存功能: 自动将entry节点加载进缓存结构 当缓存的数据超过设置的最大值时,使用LRU算法移除 具备根据entry节点上次被访问或者写入时间计算它的过期机制...缓存的key被封装在WeakReference引用内 缓存的Value被封装在WeakReference或SoftReference引用内 统计缓存使用过程中命中率、异常率、未命中率等统计数据 Guava...Guava Cache数据结构图 ? ReferenceEntry是对一个键值对节点的抽象,它包含了key和值的ValueReference抽象类。...WriteQueue和AccessQueue 为了实现最近最少使用算法,Guava Cache在Segment中添加了两条链:write链(writeQueue)和access链(accessQueue...) .weakValues() .build(); cache.put("word","Hello Guava Cache"); System.out.println(cache.getIfPresent
前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验....//Guava Cache的使用 LoadingCache graphs = CacheBuilder.newBuilder() .expireAfterAccess...() 三: 使用实例 这里更新下我在项目中常用的guava cache的实例....service有多个方法都需要用到guava cache....好了 知道了这些就可以在项目中直接使用了, 更多的内容请看Guava Cache官方文档(翻译版):http://ifeve.com/google-guava-cachesexplained/
前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛。 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。...Ehcache、Guava Cache 所以出现了一些专门用作 JVM 缓存的开源工具出现了,如本文提到的 Guava Cache。...Guava Cache 示例 之所以想到 Guava 的 Cache,也是最近在做一个需求,大体如下: 从 Kafka 实时读取出应用系统的日志信息,该日志信息包含了应用的健康状况。...总结 最后再来总结下 Guava 的 Cache。 其实在上文跟代码时会发现通过一个 key 定位数据时有以下代码: ?...其实 Guava Cache 为了满足并发场景的使用,核心的数据结构就是按照 ConcurrentHashMap 来的,这里也是一个 key 定位到一个具体位置的过程。
前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛。 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。...Ehcache、Guava Cache 所以出现了一些专门用作 JVM 缓存的开源工具出现了,如本文提到的 Guava Cache。...Guava Cache 示例 之所以想到 Guava 的 Cache,也是最近在做一个需求,大体如下: 从 Kafka 实时读取出应用系统的日志信息,该日志信息包含了应用的健康状况。...总结 最后再来总结下 Guava 的 Cache。...其实 Guava Cache 为了满足并发场景的使用,核心的数据结构就是按照 ConcurrentHashMap 来的,这里也是一个 key 定位到一个具体位置的过程。
领取专属 10元无门槛券
手把手带您无忧上云