如果想使用 缓存,但是又觉得 redis 这种nosql 网络开销大。
又想有缓存大小、过期时间这种特性。guava的cache是一个不错的选择。
下面通过两个demon 来展示下guava的缓存如何使用。
1. Cache
//创建 cache ,过期时间 2 s
Cache<String, String> cache = CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.SECONDS)
.build();
//向缓存中添加 数据 K V 形式
cache.put("hello","where are you");
// 获取 key = hello 的 值
System.out.println(cache.getIfPresent("hello"));
// 延迟3 秒
Thread.sleep(1000 * 3);
// return null if not present
System.out.println(cache.getIfPresent("hello"));
输出结果 如下,过期时间是2s,在3s后就没有数据了。
where are you
null
2. LoadingCache
LoadingCache 和 cache 的用法差不多,但是可以自定义load方法,当找不到key 时候可以定义如何加载
LoadingCache<String, String> graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.SECONDS)
.build(
new CacheLoader<String, String>() {
@Override
public String load(String key) {
System.out.println("load key :" + key);
return key + " :value";
}
}
);
System.out.println(graphs.getUnchecked("hello"));
System.out.println(graphs.getUnchecked("hello"));
结果如下,
第一次get时候通过load 方法加载,第二次get时候走的缓存。
load key :hello
hello :value
hello :value