Guava Cache是google提供的java API开发工具包的一块。
Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好。
Guava Cache有两种创建方式:
- 1.cacheLoader
- 2.callable callback
通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值。但不同的在于cacheloader的定义比较宽泛,是针对整个cache定义的,可以认为是统一的根据key值load value的方法。而callable的方式较为灵活,允许你在get的时候指定。
LoadingCache方法设值
public void loadingCache() {
LoadingCache cacheBuilder = CacheBuilder
.newBuilder()
.build(new CacheLoader() {
@Override
public String load(String key) throws Exception {
String strProValue = "hello " + key + "!";
return strProValue;
}
});
try {
System.out.println("jerry value:" + cacheBuilder.get("jerry"));
System.out.println("peida value:" + cacheBuilder.get("peida"));
cacheBuilder.put("harry", "ssdded");
System.out.println("harry value:" + cacheBuilder.get("harry"));
} catch (ExecutionException e) {
e.printStackTrace();
}
}
如果根据key获取value的方式一样,可以采用这种,比较方便
Callable方式设值
public void callableCache() {
Cache cache = CacheBuilder.newBuilder().maximumSize(1000).build();
String resultVal = null;
try {
resultVal = cache.get("jerry", new Callable() {
public String call() {
String strProValue = "hello " + "jerry" + "!";
return strProValue;
}
});
System.out.println("jerry value : " + resultVal);
resultVal = cache.get("peida", new Callable() {
public String call() {
String strProValue = "hello " + "peida" + "!";
return strProValue;
}
});
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("peida value : " + resultVal);
}
这个稍灵活一些,可以根据key
来灵活指定value
的生成方式。
GuavaCacheUtil工具类
public class GuavaCacheUtil {
private static volatile GuavaCacheUtil guavaCacheUtil;
public static volatile Cache cache;
public static GuavaCacheUtil getInstance() {
if (null == guavaCacheUtil) {
synchronized (GuavaCacheUtil.class) {
if (null == guavaCacheUtil) {
guavaCacheUtil = new GuavaCacheUtil();
}
}
}
return guavaCacheUtil;
}
static {
try {
//30分钟过期
cache = CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).build();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除key
*
* @param key
*/
public static void remove(String key) {
cache.invalidate(key);
}
/**
* 根据key取值
*
* @param key
* @return
*/
public static Object get(String key) {
return cache.getIfPresent(key);
}
/**
* 赋值
*
* @param key
* @param value
*/
public static void put(String key, Object value) {
cache.put(key, value);
}
public static void main(String[] args) {
GuavaCacheUtil.put("name", "jack");
System.out.println(GuavaCacheUtil.get("name"));
}
}
这是简化版的工具类,仅仅提供缓存的设置和取值功能,和EhCacheUtil的功能类似,用于cache使用场景比较多,而且需要灵活设值、删除key的地方。
源码下载
[本工程详细源码]
(https://github.com/chykong/java_component/tree/master/chapter2_2_guavaCache)