Cache 接口
put(key,value):往缓存中添加值;
V value = cache.get(key, Callable<? Extends V> value):从缓存中获取值;
// 等价
value = cache.get(key);
if(value == null){value = someService.retrieveValue();cache.put(key,value);
}
如果不想执行异步任务,可以使用Callables
Callable<String> value = Callables.returning("Foo");cache.get(key,Callables.returning(someService.retrieveValue());
getIfPresent(key):如果存在返回value,否则null;
丢弃缓存
invalidate(key)
invalidateAll()
invalidateAll(Iterable<?> keys)
LoadingCache
Book book = loadingCache.get(id);
Loading values
ImmutableMap<key,value> map = cache.getAll(Iterable<? Extends key>);
Refreshing values in the cache
refresh(key);
示例
package bbejeck.guava.chapter6.cache;import bbejeck.guava.common.model.TradeAccount;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import org.junit.Test;import java.util.concurrent.TimeUnit;import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.*;/*** User: Bill Bejeck* Date: 7/22/13* Time: 10:53 PM*/
public class LoadingCacheTest {private CacheLoader<String, TradeAccount> cacheLoader = mock(CacheLoader.class);@Testpublic void testCacheLoaderOnlyCalledOnce() throws Exception {TradeAccount expectedTradeAccount = new TradeAccount.Builder().balance(250000.12).build();when(cacheLoader.load("223")).thenReturn(expectedTradeAccount);LoadingCache<String, TradeAccount> tradeAccountCache = CacheBuilder.newBuilder().maximumSize(5000L).build(cacheLoader);TradeAccount tradeAccount = tradeAccountCache.get("223");assertThat(tradeAccount, is(expectedTradeAccount));for (int i = 0; i < 10; i++) {TradeAccount tradeAccount1 = tradeAccountCache.get("223");assertThat(tradeAccount1, is(expectedTradeAccount));}verify(cacheLoader, times(1)).load("223");}@Testpublic void testCacheLoaderCalledInitiallyAndAfterExpiration() throws Exception {TradeAccount expectedTradeAccount = new TradeAccount.Builder().balance(250000.12).build();when(cacheLoader.load("223")).thenReturn(expectedTradeAccount);LoadingCache<String, TradeAccount> tradeAccountCache = CacheBuilder.newBuilder().maximumSize(5000L).expireAfterAccess(500l, TimeUnit.MILLISECONDS).build(cacheLoader);TradeAccount tradeAccount = tradeAccountCache.get("223");assertThat(tradeAccount, is(expectedTradeAccount));Thread.sleep(1000);TradeAccount tradeAccount1 = tradeAccountCache.get("223");assertThat(tradeAccount1, is(expectedTradeAccount));verify(cacheLoader, times(2)).load("223");}}