GuavaCache是Google研发的本地缓存方案,和redis、memcache、ehcache差不多,存储形式都属于Key-Value,都是为了加快程序读取数据的速度而产生的技术。
那么GuavaCache与redis还是有所区别的,相对于redis这种存储在本地磁盘上的key-value数据库不同的是,GuavaCache是存储在内存中的,这也导致了GuavaCache的几个特点:
1,缓存的容量受内存大小影响
2,由于缓存数据在内存中,读取的速度更快
3,这种缓存是线程安全的
这也就说明了GuavaCache的应用场景是:适用于存储一些访问量大,但是数据量极小,且不是特别重要的数据。
下面是官方的demo
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener(MY_LISTENER)
.build(
new CacheLoader<Key, Graph>() {
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});复制代码
其中LoadingCache继承了Cache接口,我们利用CacheBuilder初始化Cache的参数,
maximumSize设置缓存的最大容量
expireAfterWritr设置缓存的生存时间,后面是单位TimeUnit.MINUTES代表每分钟,TimeUnit.HOURS代表每小时
我们可以新建一个工具类叫做TokenCache,做一个demo。
**
* @ClassName TokenCache
* @Description TODO
* @Author liumingkang
* @Date 2019-01-14 20:18
* @Version 1.0
**/
public class TokenCache {
public static final String TOKEN_PREFIX = "token_";
private static LoadingCache<String,String> localCache = CacheBuilder.newBuilder().initialCapacity(1000).maximumSize(10000).
expireAfterAccess(12, TimeUnit.HOURS).build(new CacheLoader<String, String>() {
//默认的数据加载器,如果get值时候没有命中缓存的key,则调用此方法
@Override
public String load(String s) throws Exception {
return "null";
}
});
public static void setKey(String key,String value){
localCache.put(key,value);
}
public static String getKey(String key){
String value = null;
try{
value = localCache.get(key);
if ("null".equals(value)){
return null;
}
return value;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public static void removeAll(){
localCache.invalidateAll();
}
public static void remove(String key){
localCache.invalidate(key);
}
}复制代码
我们只实现了基本的get、set、remove方法。这样一个基本的工具类就完成了。
对于登陆时候我们只需执行
TokenCache.setKey(TokenName,Token);复制代码
把token存入TokenCache中,就可以了,和redis的操作很相似。
对于使用TokenCache有一点心得,因为TokenCache是在内存中的,如果你是分布式架构服务层和接口层不在一个服务器上,那么请确保TokenCache使用都在同一台服务器上即同一层。
不然会发生在Service层写入Cache,而接口层读入Cache却找不到的问题。
对于验证码这种极小的缓存,使用tokencache还是一个不错的方案。
如有言辞不准确的地方,请多包涵,我会不断改正的。