Guava缓存器源码分析——LocalCache
来源:互联网 发布:逆战刷枪软件2017 编辑:程序博客网 时间:2024/05/23 02:05
上图为缓存器所涉及的大致类图,与缓存器配置相关的参数都封装进了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实现,重载方法的实现形式基本如下:
@Overridepublic void put(K key, V value) {localCache.put(key, value);}@Override@Nullablepublic 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实现,重载方法的实现形式基本如下:
@Overridepublic void put(K key, V value) {localCache.put(key, value);}@Override@Nullablepublic 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实现,重载方法的实现形式基本如下:
@Overridepublic void put(K key, V value) {localCache.put(key, value);}@Override@Nullablepublic 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
- Guava缓存器源码分析——LocalCache
- Guava缓存器源码分析——LocalCache
- Guava缓存器源码分析——LocalCache
- Guava缓存器源码分析——LocalCache
- Guava缓存器源码分析——缓存统计器
- Guava缓存器源码分析——CacheBuilderSpec
- Guava缓存器源码分析——CacheBuilder
- Guava缓存器源码分析——数据查询
- Guava缓存器源码分析——键值类型
- Guava缓存器源码分析——数据加载
- Guava缓存器源码分析——删除消息
- Guava缓存器源码分析——CacheBuilder
- Google Guava--localcache本地缓存实例
- Google Guava Cache--localcache本地缓存实例
- 缓存框架Guava Cache部分源码分析
- Guava源码分析——ServiceManager
- LocalCache本地缓存分享
- LocalCache本地缓存
- NSPredicate使用(1)——标识符说明
- guagga入门-我们对guagga的修改
- java web 初学应该知道的一些配置
- windows服务器中检测PHP SSL是否开启以及开启SSL的方法
- C#入门之循环结构
- Guava缓存器源码分析——LocalCache
- mobileBUGFix.mini.js
- 基于view的复用的自定义横向滚动的Viewgroup
- 【PHP兴趣部落-08】PHP中时区设置的三种方法(timezone)
- guagga入门-lib库介绍
- 使用Aajx将Canvas传入后台
- 【Unity&DragonBones】遇到的问题
- AndroidStudio 导入项目需要修改的地方
- 负载均衡的多种解决方案