2019独角兽企业重金招聘Python工程师标准>>>
链接地址:http://www.xx566.com/detail/167.html
上一篇,Guava库学习:学习Guava Cache(一)MapMaker中我们简单的学习了Guava Cache,提到了MapMaker中的缓存机制,对Guava Cache的机制做了初步的了解,在文章的最后,我们提到了CacheBuilder(Guava Cache的核心),在开始Guava CacheBuilder的学习之前,我们先来做一些准备工作:Guava caches(1)_Cache。
Guava Cache缓存机制有两个基本的接口:Cache和LoadingCache,LoadingCache接口继承自Cache接口,本篇我们首先来学习Cache接口。
Cache
Cache接口提供了键和值的映射,但是Cache接口中提供的一些方法比HashMap提供的更基本。使用maps或caches的传统做法是:我们提 供一个key,如果缓存中存在key对应的value值,我们就将这个value值返回,否则的话,如果通过相应的key找到映射关系,就返回null 值,为了在缓存中设置value值,我们可能需要这样做:
put(key,value);
|
我们需要明确的在cache或map中关联key和value,Cache使用了传统的put方法设置value值,但是获取value的时候,Guava Cache有自己的调用风格,如下:
V value = cache.get(key, Callable Extends V> value);
|
上面的方法会检索当前的value值,如果值不存在的话会从Callback实例中提取value值,通过key关联value,并返回相应的value值,它为我们提供了通过调用一个方法来替代下面风格的编程:
value = cache.get(key);
if(value == null){
value = someService.retrieveValue();
cache.put(key,value);
}
一个回调函数的使用意味着一个异步操作可能会发生,但是如果我们不需要执行一个异步任务我们又该怎么做呢?我们可以使用com.google.common.util. concurrent包里面的Callables类,Callables提供了一个方法用于处理Callable接口,使用代码如下所示:
Callable
"Foo"
);
|
在上面的代码中,我们调用returning()方法构造并返回了一个Callable实例,当这个Callable实例调用get方法时会返回我们传递的“Foo”值,所以我们可以重新实现一下我们最初的代码:
cache.get(key,Callables.returning(someService.retrieveValue());
|
需要记住的是,如果value存在,缓存的value就会被返回。如果我们偏爱“如果存在...否则...”这样的编程风格的话,Guava同样提供了 getIfPresent(key)方法,使我们可以以传统方式编程,同样也一些使缓存中的value值失效的方法,如下所示:
invalidate(key):废弃缓存中当前key对应的所有value值。
invalidateAll():废弃缓存中所有的value值。
invalidateAll(Iterable> keys):废弃传入key集合中对应的所有缓存中的value值。