Guava Cache之MapMaker

MapMaker 是位于 com.google.common.collect 包下,用于构造 ConcurrentMap 的工具类。它功能强大,可构造线程安全的 ConcurrentHashMap,能构造不同 reference 作为键值的 Map,还能构造有自动移除过期项、最大限制数目等特性的 Map,在缓存场景很有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MapMaker: 超级强大的 Map 构造工具
所处的包 package com.google.common.collect
MapMaker 是用来构造 ConcurrentMap 的工具类。为什么可以把 MapMaker 叫做超级强大?看了下面的例子你就知道了。首先,它可以用来构造ConcurrentHashMap:得到线程安全的hashMap

ConcurrentMap<String, Object> map1 = new MapMaker() .concurrencyLevel(8) .makeMap();

对应的源码为

 @Override
  public <K, V> ConcurrentMap<K, V> makeMap() {
    if (!useCustomMap) {
      return new ConcurrentHashMap<K, V>(getInitialCapacity(), 0.75f, getConcurrencyLevel());
    }
    return (nullRemovalCause == null)
        ? new MapMakerInternalMap<K, V>(this)
        : new NullConcurrentMap<K, V>(this);
  }

构造用各种不同 reference 作为 key 和 value 的 Map:

ConcurrentMap<String, Object> map2 = new MapMaker() 
        .weakValues() 
        .makeMap();

构造有自动移除时间过期项的 Map:存放30秒后移除,可以用于存放请求的场景

ConcurrentMap<String, Object> map3 = new MapMaker() 
        .expireAfterWrite(30, TimeUnit.SECONDS) 
        .makeMap();

构造有最大限制数目的 Map:限制存放数据

//Map size grows close to the 100, the map will evict 
//entries that are less likely to be used again 
 ConcurrentMap<String, Object> map4 = new MapMaker() 
            .maximumSize(100) 
            .makeMap();

提供当 Map 里面 get 不到数据,它能够自动加入到 Map 的功能。这个功能当 Map 作为缓存的时候很有用 :

ConcurrentMap<String, Object> map5 = new MapMaker() 
        .makeComputingMap( 
          new Function<String, Object>() { 
            public Object apply(String key) { 
              return createObject(key); 
        }
private Object createObject(String key) {
// TODO Auto-generated method stub
      return "";
}});

提供拥有以上所有特性的 Map:

  ConcurrentMap<String, Object> mapAll = new MapMaker() 
        .concurrencyLevel(8) 
        .weakValues() 
        .expireAfterWrite(30, TimeUnit.SECONDS) 
        .maximumSize(100) 
        .makeComputingMap( 
          new Function<String, Object>() { 
            public Object apply(String key) { 
            //绑定获取数据的方法
              return createObject(key); 
         }

            private Object createObject(String key) {
                // TODO Auto-generated method stub
                return null;
            }});
### Guava 缓存的使用与实现 #### 创建和配置缓存实例 `LocalCache` 是整个 Guava Cache 的核心类,包含了数据结构以及基本操作方法[^1]。通过 `CacheBuilder` 类可以方便地构建并定制化缓存对象。 ```java import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; // 构建一个简单的本地缓存实例 Cache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(100) // 设置最大条目数为100 .build(); ``` #### 自定义加载器 对于更复杂的场景,可以通过指定 `CacheLoader` 来自动填充缺失键对应的值: ```java import com.google.common.base.Optional; import com.google.common.cache.CacheLoader; Cache<String, Optional<String>> loadingCache = CacheBuilder.newBuilder() .maximumSize(100) .build(new CacheLoader<String, Optional<String>>() { @Override public Optional<String> load(String key) throws Exception { return Optional.ofNullable(fetchValueForKey(key)); } }); ``` 这里展示了如何设置当请求不存在于缓存中的时候,默认调用给定的方法来获取该值,并将其加入到缓存中以便后续访问[^2]。 #### 添加、检索及移除元素 可以直接利用 put 方法向缓存添加新项;getIfPresent 可用于查询特定键是否存在及其关联值;而 invalidate 则允许删除单个或全部记录。 ```java // 向缓存中添加一项 cache.put("key", "value"); // 获取已存在的项 String value = cache.getIfPresent("key"); // 移除某项 cache.invalidate("key"); ``` #### 高级特性支持 Guava 还提供了诸如过期时间(expireAfterWrite/expireAfterAccess)、刷新机制(refresh)等功能的支持,这些都极大地方便了开发者针对不同应用场景灵活调整缓存行为。 #### 并发控制优化 由于设计之初就考虑到了多线程环境下的高效运作,因此即使是在高并发读写的条件下也能保持良好的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值