首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Guava CacheBuilder使用说明 原

Guava CacheBuilder使用说明 原

作者头像
随风溜达的向日葵
发布于 2018-08-15 03:50:22
发布于 2018-08-15 03:50:22
2.4K00
代码可运行
举报
文章被收录于专栏:技术墨客技术墨客
运行总次数:0
代码可运行

CacheBuilder是Guava用于创建LoadingCache、Cache实例的构建类。可以使用下面的方法来创建一个Cache实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LoadingCache<String, JsonObject> cacheDemo = CacheBuilder.newBuilder().concurrencyLevel(5).expireAfterAccess(30, TimeUnit.MINUTES).initialCapacity(100).maximumSize(5000)
				.recordStats().removalListener(entry -> {
					LOG.info("remove cache! Entry key = " + entry.getKey());
				}).build(new CacheLoader<String, JsonObject>() {
					@Override
					public JsonObject load(String key) throws Exception {
						return readEntryFromDb(key);
					}
				});

Guava CacheBuilder构建的缓存特性

    通过CacheBuilder构建的Cache实例具有以下特性:

  1. 将数据写入缓存时是原子操作。
  2. 当缓存的数据达到最大规模时,会使用“最近最少使用(LRU)”算法来清除缓存数据。
  3. 每一条数据还可以基于时间回收,未使用时间超过一定时间后,数据会被回收。
  4. 当缓存被清除时,会发送通知告知。
  5. 提供访问统计功能。

使用Guava CacheBuilder需要了解的细节

  1.  通过CacheBuilder创建缓存实例的数据结构是一个hash table,其性能和特征都类似于ConcurrentHashMap。它实现了LoadingCache的所有方法和Cache接口。调用Cache::asMap接口时,会返回一个 “弱关联属性的iterators”,这意味着当获取了这个ConcurrentMap之后,当前线程操作缓存的结果都会立刻在ConcurrentMap上生效,但是不能确保其他线程修改的缓存数据会映射到已获取ConcurrentMap中。
  2. 通常情况下,缓存通过Object对象的equals方法来比对键值。但是当缓存指定成 weakKeys 类型后,键值的对比将会使用 “==”来比对。同样的,当指定为 weakValues 或 softValues 类型后,会使用"=="来比对存储值。
  3. 当设置了maximumSize、maximumWeight、expireAfterWrite、expireAfterAccess、weakKeys、weakValues、softValues等参数后,缓存的数据会根据规则自动被清除。
  4. 如果设置maximumSize、maximumWeight,在每次修改缓存数据时,都有可能有数据被清除。
  5. 如果设置了expireAfterWrite或expireAfterAccess参数,当每个缓存被修改、访问缓存数据或调用Cache::cleanUp方法时某些数据可能会被清除。此时被清除的数据,调用Cache::size时还会被计数,但是已无法被读写。
  6. 如果设置了weakKeys、weakValues、softValues,可能会出现某些存储在缓存中的数据被GC回收的情况。这些已经被回收的缓存数据会在缓存被修改、访问缓存、或调用Cache::cleanUp方法时被清除。这些被清除的数据在调用Cache::size时还会被计数,但是已无法读写。
  7. 某些缓存的配置会让缓存启动定期维护任务,任务会读写操作后被执行。调用Cache::cleanUp方法时,也会启用缓存维护任务。请勿在用于高吞吐量的缓存中调用Cache::cleanUp方法。当设置了removalListener、expireAfterWrite、expireAfterAccess、weakKeys、weakValues、softValues后,会导致维护任务运行。
  8. 由CacheBuilder创建的缓存可以被序列化和反序列化。序列化时会写入所有的配置信息,但是不会写入任何缓存数据信息。

CacheBuilder方法说明

initialCapacity(int initialCapacity)

指定用于缓存的hash table最低总规模。——例如设置了initialCapacity为60,还设置了concurrencyLevel(参阅下文说明)为8。将会把存储的空间分为8块,每块都有一个hash table结构,每个hash table的初始规模为8。如果缓存空间有限,需要预估足够大的初始化空间来缓,避免在数据增长时昂贵的扩展操作(扩展空间会导致深度COPY)。

concurrencyLevel(int concurrencyLevel)

允许同时并发更新操作数。是指对一个缓存中的数据进行更新操作时的并发量。设置这个参数后,允许并发的最大量不一定会严格遵守这个参数。因为数据被分别存储到不同的区块中,而这些数据并不是均匀分布的。在代码实现中,缓存在将会根据这个参数创建对应的ConcurrentMap个数,每一个ConcurrentMap称为一个区块。数据会分别存储到每个ConcurrentMap上,还会有另外一个数据结构来维护所有缓存数据所在的位置。因此,如果将这个参数设置过大,会导致更多时间和空间上的开销(分配了更多的区块,需要额外维护这些区块信息);如果设置过小,会导致在更新操作时,有大量的线程阻塞(更新同一个ConcurrentMap需要等待锁)。

maximumSize(long size)

允许最大的缓存条目数。需要注意的是,在数据条目数达到maximumSize之前,就可能发生数据回收事件。在缓存的数据快要达到规模上限时,缓存就会回收可能不再会使用的数据。

maximumWeight(long weight)

数据清除权重。在缓存的使用中,这个权重的概率很难理解,简单的说就是:每个参数在进入缓存之前都会使用用户自定义的Weigher对象来运算每条数据的权重值。在进行数据释放时,会参考数据的权重值和设定的“maximumWeight”来确定哪条数据需要被回收。声明代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
       .maximumWeight(100000)
       .weigher(new Weigher<Key, Graph>() {
          public int weigh(Key k, Graph g) {
            return g.vertices().size();
          }
        })
       .build(
           new CacheLoader<Key, Graph>() {
             public Graph load(Key key) { // no checked exception
               return createExpensiveGraph(key);
             }
           });
weakKeys()

将缓存中的key设置成weakKey模式。默认情况下,会使用“强关系”来保存key值。当设置为weakKey时,会使用(==)来匹配key值。在使用weakKey的情况下,数据可能会被GC。数据被GC后,可能仍然会被size方法计数,但是对其执行read或write方法已经无效。

weakValues()

将缓存中的数据设置为weakValues模式。启用weakValue设置时,某些数据会被GC。默认情况下,会使用“强关系”来保存key值。当设置为weakValue时,会使用(==)来匹配value值。数据被GC后,可能仍然会被size方法计数,但是对其执行read或write方法已经无效。

softValues()

将缓存中的数据设置为softValues模式。使用这个模式时,所有的数据都使用SoftReference类对缓存中的数据进行包裹(就是在SoftReference实例中存储真实的数据)。使用SoftReference包裹的数据,会被全局垃圾回收管理器托管,按照LRU的原则来定期GC数据。数据被GC后,可能仍然会被size方法计数,但是对其执行read或write方法已经无效。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/08/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
guava cache的一些使用经验
它本身继承自AbstractMap,实现了ConcurrentMap。是根据jdk1.7中的ConcurrentHashMap中的分段锁的原理来实现的,构造方法为:
山行AI
2019/07/12
4.9K0
guava cache的一些使用经验
Google Guava Cache 使用
缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。
MickyInvQ
2020/09/27
1.4K0
深入解析 Guava Cache- 从基本用法、回收策略、刷新策略到实现原理
Guava Cache 是非常强大的本地缓存工具,提供了非常简单 API 供开发者使用。
勇哥java实战
2025/05/16
2570
深入解析 Guava Cache- 从基本用法、回收策略、刷新策略到实现原理
GuavaCache 简单入门
缓存在各种用例中非常有用。尤其是当计算或者检索的代价很高,而需要多次在输入上检索这个值得时候,应该使用缓存。
2019/01/28
1.8K0
本地缓存组件 Guava cache 详解
缓存分为本地缓存和远端缓存。常见的远端缓存有Redis,MongoDB;本地缓存一般使用map的方式保存在本地内存中。一般我们在业务中操作缓存,都会操作缓存和数据源两部分。如:put数据时,先插入DB,再删除原来的缓存;ge数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中 。如果访问量大,我们还得兼顾本地缓存的线程安全问题。必要的时候也要考虑缓存的回收策略。
BUG弄潮儿
2021/10/08
2.7K1
本地缓存组件 Guava cache 详解
解读JVM级别本地缓存Caffeine青出于蓝的要诀3 —— 讲透Caffeine的数据驱逐淘汰机制与用法
上一篇文章中,我们聊了下Caffeine的同步、异步的数据回源方式。本篇文章我们再一起研讨下Caffeine的多种不同的数据淘汰驱逐机制,以及对应的实际使用。
是Vzn呀
2022/12/23
2.3K0
高性能本地缓存组件 Caffeine Cache
Redis 作为分布式缓存组件提供多个服务间的缓存,但是 Redis 需要网络开销,增加耗时。本地缓存是直接从本地内存中读取数据,没有网络开销,性能更高,例如秒杀系统或者数据量小的缓存等,比远程缓存更合适。
微观技术
2021/04/19
1.4K0
高性能本地缓存组件 Caffeine Cache
聊聊本地缓存神器:Caffeine
Caffeine 是基于 JAVA 8 的高性能本地缓存库。并且在 spring5 (springboot 2.x) 后,spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默认缓存组件。
一个风轻云淡
2023/11/13
2.3K0
缓存框架Caffeine探究
上面我们的 value 是一个 list,以 list 的大小作为 Entry 的大小。当把 Weigher 实现为只返回1,maximumWeight 其实和 maximumSize 是等效的。 同样的,为了性能考虑,这个限制也不会很死板
大忽悠爱学习
2022/01/10
2.2K0
缓存框架Caffeine探究
[Java 缓存] Java Cache之 Guava Cache的简单应用.
前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. 一: 什么是Guava Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing]
一枝花算不算浪漫
2018/05/18
1.6K0
Caffeine Cache 进程缓存之王
互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。
Bug开发工程师
2019/07/13
4.1K0
guava cache 用法详解
在计算机领域的各个场景中,缓存都是一个非常常用的技术手段。通过高性能的缓存暂时存储重要的数据,可以有效提升整个系统的性能。
用户3147702
2022/06/27
1.3K0
Caffeine Cache 进程缓存之王
互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。
三哥
2019/11/14
1.6K0
Caffeine Cache 进程缓存之王
GuavaCache学习笔记三:底层源码阅读
申明:转载自 https://www.cnblogs.com/dennyzhangdd/p/8981982.html
一枝花算不算浪漫
2018/12/25
1.1K0
[译]高性能缓存库Caffeine介绍及实践
本文我们将介绍Caffeine-一个Java高性能缓存库。缓存和Map之间的一个根本区别是缓存会将储存的元素逐出。逐出策略决定了在什么时间应该删除哪些对象,逐出策略直接影响缓存的命中率,这是缓存库的关键特征。Caffeine使用Window TinyLfu逐出策略,该策略提供了接近最佳的命中率。
东溪陈姓少年
2020/08/06
2.2K0
Caffeine缓存的简单介绍
一个清理策略会决定在某个给定时间哪些对象应该被删除,这个策略直接影响缓存的命中率——缓存库的一个关键特性。
用户7353950
2022/06/23
1.5K0
java中用好cache
在java开发中经常会遇到下面的代码: Graph get(Key key) { Graph result = get( key ); if( null == result ) { result = createNewGraph( key ); put( key, result ); } return result; } 即根据某个Key值,到缓存里查找是否有对应的值,如没有则创建,并把创建的结果保存在缓存里,供下次使用。 上述代码表面上看没
jeremyxu
2018/05/10
7500
Java本地缓存
缓存是计算机系统中一种常见的数据存储技术。它用于临时存储经常访问的数据,以提高系统的性能和响应速度。
一个风轻云淡
2024/01/20
7000
Caffeine实现本地缓存
Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine
司夜
2023/03/31
1.6K0
Caffeine实现本地缓存
本地缓存无冕之王Caffeine Cache
在常规的软件开发流程中,缓存的重要性日益凸显。它不仅为用户带来了更迅速的反馈时间,还能在大多数情况下有效减轻系统负荷。
BookSea
2023/09/19
7590
本地缓存无冕之王Caffeine Cache
推荐阅读
相关推荐
guava cache的一些使用经验
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档