guava cache
适用场景
缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。
Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。
通常来说,Guava Cache适用于:
- 你愿意消耗一些内存空间来提升速度。
- 你预料到某些键会被查询一次以上。
- 缓存中存放的数据总量不会超出内存容量。
guava cache的创建方式:
1. cacheLoader
2. callable callback
通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值。但不同的在于cacheloader的定义比较宽泛,是针对整个cache定义的,可以认为是统一的根据key值load value的方法。而callable的方式较为灵活,允许你在get的时候指定。
cacheLoader:
@Test
public void TestLoadingCache() throws Exception{
LoadingCache<String,String> cahceBuilder= CacheBuilder
.newBuilder()
.build(new CacheLoader<String, String>(){
@Override
public String load(String key) throws Exception {
String strProValue=key+System.currentTimeMillis();
return strProValue;
} }); System.out.println("jerry value:"+cahceBuilder.get("jerry"));
System.out.println("peida value:"+cahceBuilder.get("peida"));
cahceBuilder.put("harry", "ssdded");
System.out.println("harry value:"+cahceBuilder.get("harry"));
}
callable callback
@Test
public void testCallableCache()throws Exception{
Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).build();
String resultVal = cache.get("jerry", new Callable<String>() {
public String call() {
String strProValue="hello "+"jerry"+"!"+System.currentTimeMillis();
return strProValue;
}
});
System.out.println("jerry value : " + resultVal); resultVal = cache.get("peida", new Callable<String>() {
public String call() {
String strProValue="hello "+"peida"+"!"+System.currentTimeMillis(;
return strProValue;
}
});
System.out.println("peida value : " + resultVal);
}
一个完整的例子
LoadingCache<String, String> cahceBuilder = CacheBuilder
.newBuilder()
.maximumSize(2)
.weakKeys()
.softValues()
.refreshAfterWrite(120, TimeUnit.SECONDS)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener(new RemovalListener<String, String>() {
@Override
public void onRemoval(RemovalNotification<String, String> rn) {
System.out.println(rn.getKey() + "被移除"); }
})
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
return "hello " + key + "!"+System.currentTimeMillis();
} }); System.out.println("jerry value:" + cahceBuilder.get("jerry"));
System.out.println("peida value:" + cahceBuilder.get("peida"));
cahceBuilder.put("harry", "ssdded");
System.out.println("harry value:" + cahceBuilder.get("harry"));
cache的参数说明:
回收的参数:
1. 大小的设置:CacheBuilder.maximumSize(long) CacheBuilder.weigher(Weigher) CacheBuilder.maxumumWeigher(long)
2. 时间:expireAfterAccess(long, TimeUnit) expireAfterWrite(long, TimeUnit)
3. 引用:CacheBuilder.weakKeys() CacheBuilder.weakValues() CacheBuilder.softValues()
4. 明确的删除:invalidate(key) invalidateAll(keys) invalidateAll()
5. 删除监听器:CacheBuilder.removalListener(RemovalListener)
refresh机制:
1. LoadingCache.refresh(K) 在生成新的value的时候,旧的value依然会被使用。
2. CacheLoader.reload(K, V) 生成新的value过程中允许使用旧的value
3. CacheBuilder.refreshAfterWrite(long, TimeUnit) 自动刷新cache
最新文章
- (转载) Linux IO模式及 select、poll、epoll详解
- js实现由分隔栏决定两侧div的大小—js动态分割div
- 什么是智能扫描开单打印进销存POS?安卓工业手持PDA设备上的POS销售开单,现场打印打票,用扫描枪太方便了
- net-snmp源码VS2013编译添加加密支持(OpenSSL)(在VS里配置编译OpenSSL)
- django1.7取消syncdb后不能创建model相应表的问题
- 【MYSQL】在脚本中使用变量-执行脚本时传参
- BF533的SPORT接口
- XAML: 获取元素的位置
- Java范型
- Git详解之七:自定义Git
- 数据库中row_number()、rank()、dense_rank() 的区别
- elasticsearch x-pack
- Notepad++ 安装连接服务器的NppFTP插件
- freemarker导出带图片的word文档
- PHP中写定时任务
- 隔离 docker 容器中的用户-------分享链接
- 第7讲 SPI和RAM IP核
- python 基础总计 2
- BZOJ 2726 [SDOI2012] 任务安排 - 斜率优化dp
- CRC32加密算法原理
热门文章
- HDU 1538
- connect VisualVM to Tomcat
- Node.js热部署方式
- Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?
- CentOS 7 做服务器 CentOS 5 做客服机 搭建Apache+php+mysql网页
- twig一些常用的用法总结【原创】
- Qt StyleSheet样式表实例(转)
- Datagridview 添加checkbox列,并判断Datagridview 中的checkbox列是否被选中
- (C++) CreateThread
- str转unsigned int