Guava缓存器源码分析——LocalCache

转载 2017年01月03日 18:06:36




 
    上图为缓存器所涉及的大致类图,与缓存器配置相关的参数都封装进了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方法。


 
    上图为缓存器所涉及的大致类图,与缓存器配置相关的参数都封装进了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方法。

http://blog.csdn.net/desilting/article/details/11768817




 
    上图为缓存器所涉及的大致类图,与缓存器配置相关的参数都封装进了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方法。

Guava缓存器源码分析——LocalCache

上图为缓存器所涉及的大致类图,与缓存器配置相关的参数都封装进了CacheBuilder中,与缓存器载入数据相关的操作都封装进了CacheLoader中,并将CacheLoader设计为抽象类,数据载入...
  • Desilting
  • Desilting
  • 2013年09月17日 13:34
  • 8410

Google Guava--localcache本地缓存实例

何为缓存?本地缓存类似于map,当给定一个key,首先查找缓存中是否已经有值了,如果有则直接返回数据;相反如果不存在这样的key,则将新的内容value值缓存起来,以便下一次来查询,可以快速返回。 当...
  • happy_cheng
  • happy_cheng
  • 2015年02月12日 21:08
  • 5277

Google Guava Cache--localcache本地缓存实例

何为缓存?本地缓存类似于map,当给定一个key,首先查找缓存中是否已经有值了,如果有则直接返回数据;相反如果不存在这样的key,则将新的内容value值缓存起来,以便下一次来查询,可以快速返回。 ...
  • u013851082
  • u013851082
  • 2017年03月31日 14:46
  • 735

Guava Cache 本地缓存组件浅析

cache组件中核心的类和接口列举如下: 接口: Cache 本地缓存的顶级接口,提供一些对缓存进行get,put的方法,以及获取缓存统计数据的方法等。 LoadingCache 继承了Cache接...
  • jb_peng
  • jb_peng
  • 2017年03月02日 12:08
  • 1264

Guava Cache内存缓存使用实践-定时异步刷新及简单抽象封装

缓存在应用中是必不可少的,经常用的如redis、memcache以及内存缓存等。Guava是Google出的一个工具包,它里面的cache即是对本地内存缓存的一种实现,支持多种缓存过期策略。 Gua...
  • u012859681
  • u012859681
  • 2017年07月17日 16:53
  • 4139

Guava缓存器源码分析——缓存统计器

Guava缓存器统计器实现: 全局统计器——         1、CacheBuilder的静态成员变量Supplier CACHE_STATS_COUNTER初始化时,重载的get方法...
  • Desilting
  • Desilting
  • 2013年09月18日 12:09
  • 2801

Guava缓存器源码分析——数据加载

Guava缓存器加载数据的方式有两种:同步(loadSync)与异步(loadAsync)。      同步方式——      只在取数据 V get(K, int, CacheLoader)执行...
  • Desilting
  • Desilting
  • 2013年09月17日 13:38
  • 2943

Guava缓存器源码分析——数据查询

Guava缓存器的数据查询函数调用:     get(K) ——            localCache.getOrLoad(key) ——                     get(key...
  • Desilting
  • Desilting
  • 2013年09月17日 13:35
  • 2842

Guava缓存器源码分析——CacheBuilder

CacheBuilder作为LoadingCache 与 Cache实例的创建者,具有以下特征: 1、自动载入键值至缓存;         2、当缓存器溢出时,采用最近最少使用原则进行替换。...
  • Desilting
  • Desilting
  • 2013年09月17日 13:31
  • 16195

Guava缓存器源码分析——CacheBuilderSpec

CacheBuilderSpec为CacheBuilder的配置规范类,类结构图如下:            配置参数字符串cacheBuilderSpecification的格式:"maximu...
  • Desilting
  • Desilting
  • 2013年09月17日 13:29
  • 2263
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Guava缓存器源码分析——LocalCache
举报原因:
原因补充:

(最多只允许输入30个字)