使用google guava做内存缓存
Posted 嘚吧嘚吧嘚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用google guava做内存缓存相关的知识,希望对你有一定的参考价值。
前几天搞了一天,用redis做缓存,还没用两天,今天负责人要我改用谷歌提供的guava做缓存,说是因为redis用的是集群,不符合项目要求,所以今天上午研究了一下guava的缓存,并成功运行,我对比前两天用到的redis,感觉guava更容易上手,下面介绍下guava的缓存使用方法。
guava的jar包:链接:http://pan.baidu.com/s/1dEJvmIt 密码:pb96;
google guava中有cache包,此包提供内存缓存功能。内存缓存需要考虑很多问题,包括并发问题,缓存失效机制,内存不够用时缓存释放,缓存的命中率,缓存的移除等等。 当然这些东西guava都考虑到了。
guava中使用缓存需要先声明一个CacheBuilder对象,并设置缓存的相关参数,然后调用其build方法获得一个Cache接口的实例。请看下面的代码和注释,注意在注释中指定了Cache的各个参数。
package guava; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; public class test { public static void main(String[] args) throws ExecutionException, InterruptedException{ //缓存接口这里是LoadingCache,LoadingCache在缓存项不存在时可以自动加载缓存 LoadingCache<String,List> studentCache //CacheBuilder的构造函数是私有的,只能通过其静态方法newBuilder()来获得CacheBuilder的实例 = CacheBuilder.newBuilder() //设置并发级别为8,并发级别是指可以同时写缓存的线程数 .concurrencyLevel(8) //设置写缓存后8秒钟过期 .expireAfterWrite(8, TimeUnit.SECONDS) //设置缓存容器的初始容量为10 .initialCapacity(10) //设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项 .maximumSize(100) //使用弱引用存储键。当没有(强或软)引用到该键时,相应的缓存项将可以被垃圾回收。由于垃圾回收是依赖==进行判断,因此这样会导致整个缓存也会使用==来比较键的相等性,而不是使用equals(); .weakKeys() //使用弱引用存储缓存值。当没有(强或软)引用到该缓存项时,将可以被垃圾回收。由于垃圾回收是依赖==进行判断,因此这样会导致整个缓存也会使用==来比较缓存值的相等性,而不是使用equals(); .weakValues() //设置要统计缓存的命中率 .recordStats() //build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存 .build( new CacheLoader<String,List>() { @Override public List load(String key) throws Exception { System.out.println("load student " + key); List list = new ArrayList<>(); Student student = new Student(); student.setId(key); student.setName("name " + key); list.add(student); return list; } } ); for (int i=0;i<20;i++) { //从缓存中得到数据,由于我们没有设置过缓存,所以需要通过CacheLoader加载缓存数据 List studen3 = studentCache.get("123"); System.out.println(studen3.toString()); //休眠1秒 TimeUnit.SECONDS.sleep(1); } } } class Student{ String id; String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
guava的内存缓存非常强大,可以设置各种选项,而且很轻量,使用方便。另外还提供了下面一些方法,来方便各种需要:
ImmutableMap<K, V> getAllPresent(Iterable<?> keys)
一次获得多个键的缓存值put
和putAll
方法向缓存中添加一个或者多个缓存项invalidate
和invalidateAll
方法从缓存中移除缓存项asMap()
方法获得缓存数据的ConcurrentMap<K, V>
快照cleanUp()
清空缓存refresh(Key)
刷新缓存,即重新取缓存数据,更新缓存
以上是关于使用google guava做内存缓存的主要内容,如果未能解决你的问题,请参考以下文章