您当前的位置: 首页 > 

顧棟

暂无认证

  • 4浏览

    0关注

    227博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Guava的 Caches说明 31.0.1-jre版本

顧棟 发布时间:2022-03-03 20:19:19 ,浏览量:4

Caches Explained

文章目录
  • 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
原文地址: github wiki

Example
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 通过CacheLoader

LoadingCache是一个由附加的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

关注
打赏
1663402667
查看更多评论
0.0484s