首先需要引入pom依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>24.1-jre</version>
</dependency>
生成一个LoadingCache对象
LoadingCache<String, WebSocketSender>websocketCaches = CacheBuilder.newBuilder()
//设置对象在时间没有被写访问则删除
.expireAfterWrite(15,java.util.concurrent.TimeUnit.SECONDS)
//设置定时刷新 .refreshAfterWrite(60,java.util.concurrent.TimeUnit.SECONDS)
.maximumSize(1000000)// 设置缓存上线
// 移除监听器,缓存对象被删除时执行下面的onRemove方法
.removalListener(newRemovalListener<String, WebSocketSender>(){
@Override
public voidonRemoval(RemovalNotification<String, WebSocketSender> notification) {
notification.getValue().close();
}
})
// cacheloading类 实现自动加载,当调用get方法获取不到时会执行下面的load方法put进缓存 load方法用来获取存取的value
.build(new CacheLoader<String, WebSocketSender>() {
@Override
public WebSocketSenderload(String key) throws Exception {
// 一般是从sql或者nosql数据库获取缓存对象
returngenerateWebSocketSender(key);
}
});
方法的调用:
asMap所有视图 asMap视图提供了缓存的ConcurrentMap形式
cache.asMap()包含当前所有加载到缓存的项。因此相应地,cache.asMap().keySet()包含当前所有已加载键;
asMap().get(key)实质上等同于cache.getIfPresent(key),而且不会引起缓存项的加载。这和Map的语义约定一致
所有读写操作都会重置相关缓存项的访问时间,包括Cache.asMap().get(Object)方法和Cache.asMap().put(K,V)方法,但不包括Cache.asMap().containsKey(Object)方法,也不包括在Cache.asMap()的集合视图上的操作。比如,遍历Cache.asMap().entrySet()不会重置缓存项的读取时间。
LoadingCache方法的使用
1)V get(K k): 内部调用getOrLoad(K key)方法,缓存中有对应的值则返回,没有则使用CacheLoader load方法
getOrLoad(K key)方法为线程安全方法,内部加锁
2)V getIfPresent(Object key):缓存中有对应的值则返回,没有则返回NULL
Long size():缓存对象数量
put(K key,V value): 直接显示地向缓存中插入值,这会直接覆盖掉已有键之前映射的值。
invalidate(Object key):显式地清除指定key的缓存对象
invalidateAll(): 清除所有缓存对象