目录
零、说明
Guava - cache是一个本地缓存,读了一些源码和文档在此总结一下。
先来个上手例子(学习官网套路)
LoadingCache<Key, Object> loadingCache = CacheBuilder.newBuilder()
.maximumSize(1000) //缓存最大个数
.expireAfterWrite(10, TimeUnit.MINUTES) //缓存淘汰-写入10分钟后淘汰
.removalListener(MY_LISTENER)//缓存移除监听
.build(
new CacheLoader<Key, Objext>() {
public Object load(Key key) throws AnyException {
return createObject(key);//加载方法
}
});
一、初始化
1.初始化方法
LoadingCache = CacheBuilder.newBuilder().build(CacheLoader cacheLoader);
2.参数设置
CacheBuilder.newBuilder().设置参数
3.参数列表及解释(都为CacheBuilder的参数)
参数 |
类型 | 说明 |
maximumSize |
long |
缓存对象个数 |
maximumWeight |
long |
权重大小 |
weigher |
Weigher<? super K, ? super V> |
权重算法 |
expireAfterWrite |
long |
写入后有效时长 |
expireAfterAccess |
long |
使用后有效时长 |
ticker |
Ticker |
时间源 |
removalListener |
RemovalListener<? super K, ? super V> |
移除监听 |
二、缓存回收机制
- 定时回收
-
- 根据expireAfterWrite做写入后的超时回收
- 根据expireAfterAccess做最后一次使用后超时回
- 权重回收
-
- 设置maximumWeight最大权重
- 设置权重算法weigher
- Reference-based
-
- 根据弱引用以及软引用进行回收
三、LoadingCache API
方法 | 参数 | 返回值 | 说明 |
V get(K key) throws ExecutionException |
key:缓存键 | 缓存对象 | 从缓存中获取key对应的对象,若缓存没有则从load中获取并加载到缓存中 |
V getUnchecked(K key) |
key:缓存键 | 缓存对象 | 从缓存中获取key对应的对象,若缓存没有则从load中获取并加载到缓存中 |
ImmutableMap<K, V> getAll(Iterable<? extends K> keys ) throws ExecutionException |
keys:缓存键列表迭代器 | 缓存对象map | 从缓存中获取keys对应的对象,若缓存没有则从load中获取并加载到缓存中 |
void refresh(K var1) |
key:缓存键 | 从load中刷新key对应的值到本地缓存 | |
ConcurrentMap<K, V> asMap() |
缓存map对象 | 获取缓存内容map |
四、其他说明
LoadingCache 继承了 Cache,可直接构建Cache,封装Cache对象,实现本地缓存
示例:
Cache cache = CacheBuilder.newBuilder()
.maximumSize(1000) //缓存最大个数
.expireAfterWrite(10, TimeUnit.MINUTES) //缓存淘汰-写入10分钟后淘汰
.removalListener(MY_LISTENER)//缓存移除监听
.build();
Cache本身有很多API,可以封装形成自己实用的LocalCache
Cache API(偷懒一下)
<strong>@Nullable
V getIfPresent(Object var1);
V get(K var1, Callable<? extends V> var2) throws ExecutionException;
ImmutableMap<K, V> getAllPresent(Iterable<?> var1);
void put(K var1, V var2);
void putAll(Map<? extends K, ? extends V> var1);
void invalidate(Object var1);
void invalidateAll(Iterable<?> var1);
void invalidateAll();
long size();
CacheStats stats();
ConcurrentMap<K, V> asMap();
void cleanUp();</strong>