- Caches Explained
- Example
- Applicability 适用范围
- Population 构建
- From a CacheLoader 通过CacheLoader
- From a Callable 通过Callable
- Inserted Directly 直接插入数据
- Eviction 清除
- Size-based Eviction 按记录数量进行清除
- Timed Eviction 按时间进行清除
- Testing Timed Eviction 测试按时间清除策略
- Reference-based Eviction 基于引用进行清除
- Explicit Removals 主动的清除
- Removal Listeners 删除监听器
- When Does Cleanup Happen?
- Refresh
- Features 特性
- Statistics 统计
- `asMap` map视图
- Interruption
LoadingCache graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener(MY_LISTENER)
.build(
new CacheLoader() {
@Override
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});
Applicability 适用范围
缓存在各种用例中都非常有用。 例如,当一个值的计算或检索成本很高时,并且您将多次在某个输入上需要它的值,您应该考虑使用缓存。
Cache
类似于 ConcurrentMap
,但并不完全相同。 最根本的区别是,ConcurrentMap
会保留所有添加到其中的元素,直到它们被显式删除。 另一方面,Cache
通常配置为自动驱逐条目,以限制其内存占用。 在某些情况下,LoadingCache
即使它不驱逐条目也会很有用,因为它会自动加载缓存。
通常,Guava 缓存实用程序适用于以下情况:
- 你愿意花一些内存来提高速度。
- 您希望键有时会被多次查询
- 您的缓存不需要存储比 RAM 容量更多的数据。(Guava 缓存对于您的应用程序的单次运行是本地的。它们不会将数据存储在文件中或外部服务器上。如果这不符合您的需求,请考虑使用类似 [Memcached](http:// memcached.org/).)
如果这些都适用于您的用例,那么 Guava 缓存实用程序可能适合您!
如上面的示例代码所示,使用CacheBuilder
构建器模式来获取Cache
,但自定义缓存是有趣的部分。
注意: 如果你不需要 Cache
的特性,ConcurrentHashMap
更节省内存——但是用任何旧的 ConcurrentMap
复制大多数 Cache
特性是极其困难或不可能的。
关于缓存的第一个问题是:是否有一些合理的默认函数来加载或计算与key关联的value? 如果是这样,您应该使用 CacheLoader
。 如果没有,或者如果您需要覆盖默认值,但您仍然需要原子的“get-if-absent-compute”语义,则应该将 Callable
传递给 get
调用。 可以使用 Cache.put
直接插入元素,但首选自动缓存加载,因为它可以更容易地推断所有缓存内容的一致性。
“get-if-absent-compute”语义:进行查询,若存在则返回,不存在则创建新值返回
Population 构建 From a CacheLoader 通过CacheLoaderLoadingCache
是一个由附加的CacheLoader
构建Cache
。创建一个CacheLoader
通常和实现V load(K key) throws Exception
方法一样简单。例如,你可以用下面的代码创建一个LoadingCache
:
LoadingCache graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.build(
new CacheLoader() {
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});
...
try {
return graphs.get(key);
} catch (ExecutionException e) {
throw new OtherException(e.getCause());
}
查询 LoadingCache
的规范方法是使用方法 get(K)。 这将返回一个已经缓存的值,或者使用缓存的 CacheLoader
以原子方式将新值加载到缓存中。 因为 CacheLoader
可能会抛出 Exception
,所以 LoadingCache.get(K)
会抛出 ExecutionException
。 (如果缓存加载器抛出 unchecked 异常,get(K)
将抛出 UncheckedExecutionException
包装它。)您也可以选择使用 getUnchecked(K)
,它将所有异常包装在 UncheckedExecutionException
中, 但是如果底层的 CacheLoader
通常会抛出检查异常,这可能会导致令人惊讶的行为。
LoadingCache graphs = CacheBuilder.newBuilder()
.expireAfterAccess(10, TimeUnit.MINUTES)
.build(
new CacheLoader() {
public Graph load(Key key) { // no checked exception
return createExpensiveGraph(key);
}
});
...
return graphs.getUnchecked(key);
可以使用方法 getAll(Iterable
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?