Guava包学习-Cache

时间:2022-05-02 07:09:35

这段时间用到了ehcache和memcache,memcache只用来配置在tomcat中做负载均衡过程中的session共享,然后ehcache用来存放需要的程序中缓存。

Guava中的Cache和ehcache其实差不多,只不过Guava并不会对数据进行持久化落盘这种操作。那其实和Map就比较相似了,你放一下static的map好像也可以办到,只不过Guava的cache支持设置最大占用的内存,已经命中统计信息之类的东西。

这里不从怎么创建一个cache,怎么去添加删除开始学习,我们先看cache下面的class文件的名称找到其中一个枚举:

Guava包学习-Cache

里面有一个叫做RemovalCause的枚举,我们看下它的内容:

package com.google.common.cache;
@GwtCompatible
public enum RemovalCause {
/**
* The entry was manually removed by the user. This can result from the user invoking
* {@link Cache#invalidate}, {@link Cache#invalidateAll(Iterable)}, {@link Cache#invalidateAll()},
* {@link Map#remove}, {@link ConcurrentMap#remove}, or {@link Iterator#remove}.
*/--------------------------移除动作是用户自己去做的
EXPLICIT {
@Override
boolean wasEvicted() {
return false;
}
}, /**
* The entry itself was not actually removed, but its value was replaced by the user. This can
* result from the user invoking {@link Cache#put}, {@link LoadingCache#refresh}, {@link Map#put},
* {@link Map#putAll}, {@link ConcurrentMap#replace(Object, Object)}, or
* {@link ConcurrentMap#replace(Object, Object, Object)}.
*/---------------------------移除动作是用户的值覆盖了现有的值
REPLACED {
@Override
boolean wasEvicted() {
return false;
}
}, /**
* The entry was removed automatically because its key or value was garbage-collected. This
* can occur when using {@link CacheBuilder#weakKeys}, {@link CacheBuilder#weakValues}, or
* {@link CacheBuilder#softValues}.
*/------------------------移除的动作是因为垃圾回收给回收掉了,但是前提是在创建的时候声明是软引用或者弱引用的key、values
COLLECTED {
@Override
boolean wasEvicted() {
return true;
}
}, /**
* The entry's expiration timestamp has passed. This can occur when using
* {@link CacheBuilder#expireAfterWrite} or {@link CacheBuilder#expireAfterAccess}.
*/---------------因为时间够了自动去除了,前提是开启了超时时间设置
EXPIRED {
@Override
boolean wasEvicted() {
return true;
}
}, /**
* The entry was evicted due to size constraints. This can occur when using
* {@link CacheBuilder#maximumSize} or {@link CacheBuilder#maximumWeight}.
*/----------------因为超过了size满了,前提是你开启了最大内存占用或者最大kv量限制
SIZE {
@Override
boolean wasEvicted() {
return true;
}
}; /**
* Returns {@code true} if there was an automatic removal due to eviction (the cause is neither
* {@link #EXPLICIT} nor {@link #REPLACED}).
*/------如果不是枚举一和二的话,返回是否其他操作把它给移除掉了
abstract boolean wasEvicted();
}

从这个k,v从缓存中消失的事件来看,其实Guava的cache就是会有缓存大小上限和时间上限的限制,同时会有这些移除策略将缓存信息移除。

所以如果应用需要这种场景:

1、需要缓存,因为可以提高性能,可以有命中key的情况,并且我不需要持久化,应用重启重新来即可;

2、JVM中有足够的缓存给它用(其实这就是JVM提供弱引用和软引用的用处了)

3、对于使用Map来缓存的场景不足以满足统计信息和限制大小的情况

4、不想外接Ehcache和memcache的配置和应用,否则服务器迁移还得安装那些玩意儿,不如直接在JVM的堆里面搞

LoadingCache<String, String> cache = CacheBuilder.newBuilder()
          .expireAfterWrite(1000, TimeUnit.MILLISECONDS)--------在写入或者更新1000毫秒后失效
.expireAfterAccess(200, TimeUnit.MILLISECONDS)--------在访问1000毫秒后失效
          .concurrencyLevel(8).initialCapacity(100)--------这个地方有点像分段锁提高性能的ConcurrentHashMap,大小100,level 8 分13段
          .maximumSize(100)---最多放100个key
          .weakKeys().weakValues()---使用弱引用
          .build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
return "hah";
}
});
     cache.put("hahah", "heiheihei");
cache.put("hahah1", "heiheihei1");
cache.put("hahah2", "heiheihei2");
cache.put("hahah3", "heiheihei3");
cache.put("hahah4", "heiheihei4");
System.out.println(cache.asMap().toString());
ConcurrentMap<String, String> map = cache.asMap();
map.remove("hahah");
System.out.println(map.toString());
System.out.println(cache.asMap().toString());
System.out.println(cache.get("hahah1"));

这里暂时不测试那些超时啊 超出大小限制啊之类的东西,可以sleep或者for循环一下去体验一下,都比较简单。至于还有其他的一些带callback获得get的或者refresh或者cleanup之类的都在使用的时候看一下它的注释应该就可以理解了。

这样子系统就可以使用这个缓存了,而不需要在以来外围的ehcache和memcache了。

try {
System.out.println(cache.get("hahah1",new Callable<String>() {
@Override
public String call() throws Exception {
//这里要做的其实是如果你没有在缓存中命中这个key,那么你要怎么做?
return null;
}
}));
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

我们发现去缓存获取key的情况之后可以写一个回掉方法,这对于需要前端进入缓存,发现未命中再透到后端去比较好用。

比如目前我们项目中的API,前端有redis集群,然后查询来了之后会拿key去redis中进行查询,如果redis中不存在,那么程序透到DB里面去查询,并且将查询到的结果放到redis中。

那么Guava的cache在你无法命中该key之后,你也可以通过自定义回调方法来进行类似的操作。

所谓的回掉方法,其实就一个new一个接口,然后接口中会有方法必须去实现~

查看Cache状态:

     CacheStats cs = cache.stats();
System.out.println(cs.hitCount());
System.out.println(cs.hitRate());

Guava包学习-Cache的更多相关文章

  1. Guava包学习---Lists

    Guava包是我最近项目中同事推荐使用的,是google推出的库.里面的功能非常多,包括了集合.缓存.原生类型支持.并发库.通用注解.字符串处理.IO等.我们项目中使用到了guava依赖,但是实际上只 ...

  2. Guava包学习--EventBus

    之前没用过这个EventBus,然后看了一下EventBus的源码也没看明白,(-__-)b.反正大概就是弄一个优雅的方式实现了观察者模式吧.慢慢深入学习一下. 观察者模式其实就是生产者消费者的一个变 ...

  3. Guava包学习---Maps

    Maps包方法列表: 还是泛型创建Map: public static <K, V> HashMap<K, V> newHashMap() { return new HashM ...

  4. Guava包学习--Hash

    我们HashMap会有一个rehash的过程,为什么呢?因为java内建的散列码被限制为32位,而且没有分离散列算法和所作用的数据,所以替代算法比较难做.我们使用HashMap的时候它自身有一个reh ...

  5. Guava包学习---I&sol;O

    Guava的I/O平时使用不太多,目前项目原因导致基本上只有在自己写一些文本处理小工具才用得到.但是I/O始终是程序猿最常遇到的需求和面试必问的知识点之一.同时Guava的I/O主要面向是时JDK5和 ...

  6. Guava包学习---Bimap

    Bimap也是Guava中提供的新集合类,别名叫做双向map,就是key->value,value->key,也就是你可以通过key定位value,也可以用value定位key. 这个场景 ...

  7. Guava包学习-Multimap

    它和上一章的MultiSet的继承结果很相似,只不过在上层的接口是Multimap不是Multiset. Multimap的特点其实就是可以包含有几个重复Key的value,你可以put进入多个不同v ...

  8. Guava包学习---Sets

    Sets包的内容和上一篇中的Lists没有什么大的区别,里面有些细节可以看一下: 开始的创建newHashSet()的各个重载方法.newConcurrentHashSet()的重载方法.newTre ...

  9. Guava包学习--Table

    Table,顾名思义,就好像HTML中的Table元素一样,其实就是行+列去确定的值,更准确的比喻其实就是一个二维矩阵. 其实它就是通过行+列两个key去找到一个value,然后它又containsv ...

随机推荐

  1. 简单Matrix 的方法说明记录

    查找资料加上自己理解  ,简单说明Android中Matrix怎么用(新手有错误的地方,希望指正,主要自己记录学习用的) Matrix包含一个3 X 3的矩阵,专门用于图像变换匹配. Matrix提供 ...

  2. redis实现有序的消息队列

    redis是什么东西就不多说了,网上文章一搜一大堆. 首先来说一下我要实现的功能: 类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时 ...

  3. cocos2d-x ScrollView、TableView

    转自:http://codingnow.cn/cocos2d-x/1024.html 在游戏和应用中经常要实现左右滑动展示游戏帮助.以列表显示内容的UI效果,就像android中的Gallery和Li ...

  4. sql server 复制表结构

    1:复制表结构及数据到新表 select * into 目的数据库名.dbo.目的表名 from 原表名 select * into my0735home.dbo.infoMianTest from ...

  5. mysql 集群方案

    试试基于Galera的MySQL高可用集群  mha  mgr

  6. 源码mysql-5&period;7&period;23在cmake时出现的小问题

    我是写的脚本安装mysql,cmake的步骤,另外用了一个小脚本,然后在脚本中用的bash执行的cmake命令,所以导致cmake实在子shell中执行的, 如果你是在命令行上一步一步的执行,报这个错 ...

  7. 将Excel表格保存为图片

    如何将Excel表格保存为图片,可参见以下几种方法: 1.借助其它办法软件,例如Word或PPT. 步骤:选中Excel中需要被保存成图片的内容,Ctrl+C进行复制,打开Word或PPT办公软件,鼠 ...

  8. 设置Linux-Centos6&period;5字符集

    登录腾讯云的服务,发现不支持中文字符.草蛋疼....  01.查看Linux当前语言 echo $LANG C    #C代表英文环境 ASCII 编码格式,通杀很多问题(乱码) 02.查看系统支持的 ...

  9. angular&period;js快速入门 hello world

    我们整个系列的学习会去写一个简单blog雏形,如果有精力再完善美化. 但是这篇还是要从HelloWorld开始学习. angular.js 文件加载我们选用 bootstrap中文网提供的一个cdn服 ...

  10. jquery 添加与删除的规律 当要添加时候要定位到自己的父元素 当要删除时候 通过事件函数传入的this找到自己的父元素进行删除

    jquery 添加与删除的规律 当要添加时候要定位到自己的父元素  当要删除时候 通过事件函数传入的this找到自己的父元素进行删除