1.Google Guava Cache
@Slf4j
public class CaCheUtil {
private CaCheUtil() {
}
public static class StaticCache {
private static final Cache<String, Object> cache =
CacheBuilder.newBuilder().
expireAfterWrite(5, TimeUnit.MINUTES).build();
}
public static Object getCache(String key) {
try {
return
StaticCache.cache.get(key, () -> {
return getDBBy(key);
});
} catch (ExecutionException e) {
log.info("get cache is fail", e);
}
return null;
}
/**
* 这里实现查询数据库的操作
*/
public static Object getDBBy(String key) {
log.info("-----------------查DB");
return "getDB";
}
public Object getLoadCaChe(String key) {
LoadingCache<String, Object> loadCache = CacheBuilder.newBuilder().
expireAfterWrite(5, TimeUnit.MINUTES).
build(new CacheLoader<String, Object>() {
@Override
public Object load(String key) throws Exception {
return getDBBy(key);
}
});
try {
return loadCache.get(key);
} catch (ExecutionException e) {
log.info("get cache is fail", e);
}
return null;
}
}
参数介绍:
expireAfterWrite是在指定项在一定时间内没有创建/覆盖时,会移除该key,下次取的时候从loading中取
expireAfterAccess是指定项在一定时间内没有读写,会移除该key,下次取的时候从loading中取
refreshAfterWrite是在指定时间内没有被创建/覆盖,则指定时间过后,再次访问时,会去刷新该缓存,在新值没有到来之前,始终返回旧值
跟expire的区别是,指定时间过后,expire是remove该key, 下次访问是同步去获取返回新值;而refresh则是指定时间后,不会remove该key,
下次访问会触发刷新,新值没有回来时返回旧值
Maven依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
其他请访问官网:https://github.com/google/guava/wiki/CachesExplained
http://ifeve.com/google-guava-cachesexplained/
Caffeine https://www.jianshu.com/p/ba2ac225836d
https://wujiazhen2.github.io/2018/09/30/Caffeine/