Guava简介
Java诞生于1995年,在这20年的时间里Java已经成为世界上最流行的编程语言之一。虽然Java语言时常经历各种各样的吐槽,但它仍然是一门在不断发展、变化的语言——除了语言本身与JDK在不断的进化,第三方库、框架也同样是日新月异。Guava正是这样一个现代的库,它简单易用,对Java语言是一个非常好的补充。
一、Guava cache
Guava Cache 是Google Fuava中的一个内存缓存模块,用于将数据缓存到JVM内存中。
提供了get、put封装操作,能够集成数据源 ;
线程安全的缓存,与ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能显示的移除元素;
Guava Cache提供了多种基本的缓存回收方式
监控缓存加载/命中情况
举个例子:
当你需要调接口获得指定的值,比如电商项目需要根据线下店铺id来获得网店信息,那么相同的店铺id,你是否要做缓存来避免重复的去调接口呢,这个时候你觉得用redis又没必要,那么guava cache你值得拥有。
通常,Guava缓存适用于以下情况:
愿意花费一些内存来提高速度。
使用场景有时会多次查询key。
缓存将不需要存储超出RAM容量的数据详细配置
缓存的并发级别
Guava提供了设置并发级别的API,使得缓存支持并发的写入和读取。与ConcurrentHashMap类似,Guava cache的并发也是通过分离锁实现。在通常情况下,推荐将并发级别设置为服务器cpu核心数。
二、Cache
话不多说直接开造
1.显式put操作置入内存
浅浅的介绍一下用的俩东西,剩下一些设置自己去参考文档里看
缓存清除策略
基于存活时间的清除策略
expireAfterWrite 写缓存后多久过期
expireAfterAccess 读写缓存后多久过期
存活时间策略可以单独设置或组合配置
基于容量的清除策略
通过CacheBuilder.maximumSize(long)方法可以设置Cache的最大容量数,当缓存数量达到或接近该最大值时,Cache将清除掉那些最近最少使用的缓存
代码如下:
private LoadingCache<String,Long> thirdShopMap = CacheBuilder.newBuilder().
expireAfterWrite(5L, TimeUnit.MINUTES).
maximumSize(5000L).
build(new CacheLoader<String, Long>() {
@Override
public Long load(String shopId) throws Exception {
System.out.println("~~~~~~");
return 1111111111111111L;
}
}
2.LoadingCache
使用自定义ClassLoader加载数据,置入内存中。从LoadingCache中获取数据时,若数据存在则直接返回;若数据不存在,则根据ClassLoader的load方法加载数据至内存,然后返回该数据
代码如下:
private LoadingCache<String,Long> thirdShopMap = CacheBuilder.newBuilder().
expireAfterWrite(5L, TimeUnit.MINUTES).
maximumSize(5000L).
build(new CacheLoader<String, Long>() {
@Override
public Long load(String shopId) throws Exception {
System.out.println("~~~~~~");
return 1111111111111111L;
}
}
thirdShopMap.get(key)
Google Guava 中文教程:https://wizardforcel.gitbooks.io/guava-tutorial/content/1.html
总结
Guava是一个非常有用的现代程序库,在Java项目中强烈推荐使用它来取代Apache Commons的一些子项目(例如Lang, Collection, IO等等),除了这里介绍的一些最常用的特性,它还包括缓存、网络、IO、函数式编程等等内容(其中函数式编程在Java 8中可以使用Stream和Lambda表达式等特性来实现)。