Guava缓存器源码分析——LocalCache

  
 
    上图为缓存器所涉及的大致类图,与缓存器配置相关的参数都封装进了CacheBuilder中,与缓存器载入数据相关的操作都封装进了CacheLoader中,并将CacheLoader设计为抽象类,数据载入方法由用户自己实现。因此,用户可以有两种方式来创建缓存器:
    1、配置完参数后,直接创建
        Cache<K1, V1> build() 
        build函数内部,通过调用new LocalCache.LocalManualCache<K1, V1>(this),创建的缓存器类型为 Cache<K1, V1>,在使用缓存器时,需要实现Callable接口的call方法来实现数据载入,如下:
       yourCache.get(key, new Callable<String>() {
              @Override
              public String call() throws Exception {
                     System.out.println("getKey()");
              }
       });
    2、配置参数并实现数据载入方法
       LoadingCache<K1, V1> build( CacheLoader<? super K1, V1> loader)
       CacheLoader为抽象类,有几个常用方法:
       1)V load(K key)  :检索或计算key的关联值,返回的值不能为null。
       2)ListenableFuture<V> reload(K key, V oldValue)  :重新计算已存在的键值。
       3)Map<K, V> loadAll(Iterable<? extends K> keys) :检索或计算keys关联的所有值,这个方法会被getAll方法调用,如果返回结果中没有包含所有请求keys的关联值,返回结果仍会被缓存,但getAll会抛出异常;如果返回结果中包含请求keys之外的键值,这些键值会被缓存,但不会被getAll返回。一般我们都会重载load方法,但是当批量检索比单个检索更有优势时,可以重载这个方法。
        通过load方法来载入数据:              
       build(
   
   
              new CacheLoader<String, Integer>() {
                      public Integer load(String key) throws Exception {
                           return loadKey(key);
                     }
              });
        build函数内部,通过调用new LocalCache.LocalLoadingCache<K1, V1>(this, loader),创建的缓存器类型为LoadingCache<K1, V1>。
       
        除了缓冲器的构建,对缓存器的实际操作也都封装在LocalCache类中,Guava通过将LocalManualCache与LocalLoadingCache设计为LocalCache的静态内部类,并在LocalManualCache类中设置一个final修饰的LocalCache成员变量,在缓存器构建时完成对LocalCache成员变量的初始化,这样不管缓存器是Cache或LoadingCache类型,用户对缓存器的操作都可以转换为对LocalCache的操作。

       并且,由于LocalLoadingCache继承至LocalManualCache,两个类需要重载的方法,除了与数据载入相关的,其它都可交由LocalManualCache实现,重载方法的实现形式基本如下:
     
     
     @Override
    public void put(K key, V value) {
      localCache.put(key, value);
    }
     @Override
    @Nullable
    public V getIfPresent(Object key) {
      return localCache.getIfPresent(key);
    }
        LocalManualCache重载了getIfPresent、get、getAllPresent、put、invalidate、invalidateAll、size、asMap、stats、cleanUp方法。
        LocalLoadingCache重载了get、getUnchecked、getAll、refresh、apply方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Guava Cache是Google Guava库中提供的一种本地缓存解决方案。它是一个基于内存的缓存,可以在应用程序内部存储数据,提高应用程序性能。 Guava Cache提供了以下特性: 1. 自动加载:当缓存中不存在某个键的值时,可以自动加载生成该值。 2. 自动移除:缓存中的某些条目可以在一定时间内自动过期,或者可以使用大小限制来限制缓存中的条目数。 3. 针对不同的缓存数据设置不同的过期时间、存活时间、最大值、最小值等。 4. 支持同步和异步缓存。 使用Guava Cache非常简单,只需要按以下步骤操作: 1. 引入Guava库。 2. 创建一个CacheBuilder对象,用于配置缓存。 3. 调用build()方法创建一个Cache对象。 4. 使用put()方法向缓存中添加数据。 5. 使用get()方法从缓存中读取数据,如果缓存中不存在该键对应的值,则可以自动加载。 6. 使用invalidate()方法从缓存中移除数据。 下面是一个简单的示例: ```java import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; public class GuavaCacheExample { public static void main(String[] args) throws ExecutionException { // 创建一个CacheBuilder对象 CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder() .maximumSize(100) // 设置缓存最大条目数 .expireAfterWrite(10, TimeUnit.MINUTES); // 设置缓存过期时间 // 创建一个Cache对象 LoadingCache<String, String> cache = cacheBuilder.build(new CacheLoader<String, String>() { @Override public String load(String key) throws Exception { System.out.println("loading " + key); // 自动加载数据 return "value-" + key; } }); // 添加数据到缓存cache.put("key1", "value1"); cache.put("key2", "value2"); // 从缓存中读取数据 System.out.println(cache.get("key1")); // 输出"value1" System.out.println(cache.get("key3")); // 输出"loading key3"和"value-key3" // 移除缓存中的数据 cache.invalidate("key1"); System.out.println(cache.get("key1", () -> "default")); // 输出"default" } } ``` 在这个示例中,我们使用CacheBuilder对象配置了缓存的最大条目数和过期时间。我们还使用CacheLoader对象创建了一个自动加载的缓存,当缓存中不存在某个键的值时,可以自动加载生成该值。我们使用put()方法向缓存中添加了两个数据,使用get()方法从缓存中读取了两个数据,并使用invalidate()方法从缓存中移除了一个数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值