一、前言
基于google的guava-19.0.jar开源包基于callback的形式、LoadingCache的形式两种不同的方式实现基于java虚拟机的内存缓存机制(有效生命周期控制expireAfterWrite),主要涉及com.google.common.cache.Cache、com.google.common.cache.CacheBuilder、com.google.common.base.Optional、java.util.concurrent.Callable、com.google.common.cache.CacheLoader、com.google.common.cache.RemovalListener等相关类使用,具体使用示例如下所示。
二、示例说明
1.基于callback的形式实现缓存demo
package test;@b@@b@import java.util.ArrayList;@b@import java.util.List;@b@import java.util.concurrent.Callable;@b@import java.util.concurrent.ConcurrentMap;@b@import java.util.concurrent.TimeUnit;@b@@b@import com.google.common.base.Optional;@b@import com.google.common.cache.Cache;@b@import com.google.common.cache.CacheBuilder;@b@@b@public class GuavaCallbackCacheTest {@b@ @b@ private static Cache<String, Optional<String>> cache = CacheBuilder.newBuilder()@b@ //.refreshAfterWrite(1, TimeUnit.HOURS) //写入一小时后自动刷新@b@ //.expireAfterAccess(1, TimeUnit.HOURS)// 最后一次访问之后多少时间后移除,即失效@b@ .expireAfterWrite(5, TimeUnit.MINUTES) //最后一次写入之后多少时间后移除,即失效@b@ .maximumSize(1000) //最大缓存记录数@b@ .build();@b@ @b@ @b@ @b@ private static Optional<String> get(String key) throws Exception{@b@ Optional<String> data = Optional.fromNullable(null);@b@ data = cache.get(key, new Callable<Optional<String>>() {@b@ @Override@b@ public Optional<String> call() throws Exception {@b@ List<String> datas=new ArrayList<String>();@b@ datas.add("data1111");@b@ datas.add("data2222");@b@ System.out.println(Thread.currentThread().getName()+"_未经过缓存获取数据!!!!");@b@ return Optional.fromNullable(datas.get(0));@b@ }@b@ });@b@ return data;@b@ }@b@ @b@ /**@b@ * 清空缓存内数据@b@ * 操作基础数据时,清除重新查询@b@ */@b@ public static void clearAll(){@b@ //全部清除缓存@b@ cache.invalidateAll();@b@ }@b@ @b@ /**@b@ * 查看缓存中内容@b@ */@b@ public static ConcurrentMap<String, Optional<String>> viewCache(){@b@ //查看内容@b@ return cache.asMap();@b@ }@b@ @b@ public static void main(String[] args) throws Exception {@b@ System.out.println(Thread.currentThread().getName()+"_cache get_1:"+get("t1").orNull());@b@ System.out.println(Thread.currentThread().getName()+"_cache get_2:"+get("t1").orNull());@b@ clearAll();@b@ System.out.println(Thread.currentThread().getName()+"_cache get_3:"+get("t1").orNull());@b@ System.out.println(Thread.currentThread().getName()+"_cache get_4:"+get("t1").orNull());@b@ @b@ System.out.println(Thread.currentThread().getName()+"caches_map:"+viewCache());@b@ }@b@@b@}
控制台结果(第一次get_1、get_1无缓存获取,get_2、get_4通过缓存获取)
main_未经过缓存获取数据!!!!@b@main_cache get_1:data1111@b@main_cache get_2:data1111@b@main_未经过缓存获取数据!!!!@b@main_cache get_3:data1111@b@main_cache get_4:data1111@b@maincaches_map:{t1=Optional.of(data1111)}
2.基于LoadingCache的形式实现缓存
package test;@b@@b@import java.util.concurrent.ConcurrentMap;@b@import java.util.concurrent.TimeUnit;@b@@b@import com.google.common.cache.CacheBuilder;@b@import com.google.common.cache.CacheLoader;@b@import com.google.common.cache.LoadingCache;@b@import com.google.common.cache.RemovalListener;@b@import com.google.common.cache.RemovalNotification;@b@@b@public class GuavaLoadingCacheTest {@b@ @b@ private static LoadingCache<String, String> cache = CacheBuilder.newBuilder()@b@ //设置大小,条目数@b@ .maximumSize(20)@b@ //设置失效时间,创建时间@b@ .expireAfterWrite(20, TimeUnit.SECONDS)@b@ //设置时效时间,最后一次被访问@b@ .expireAfterAccess(20, TimeUnit.HOURS)@b@ //移除缓存的监听器@b@ .removalListener(new RemovalListener<String, String>() {@b@ public void onRemoval(RemovalNotification<String, String> notification) {@b@ System.out.println("有缓存数据被移除了");@b@ }})@b@ //缓存构建的回调@b@ .build(new CacheLoader<String, String>(){//加载缓存@b@ @Override@b@ public String load(String key) throws Exception {@b@ System.out.println("缓存中...");@b@ return "xwood"+"_"+key;@b@ }@b@});@b@ @b@ public static void get(String name) throws Exception{@b@ System.out.println(cache.get(name));@b@// cache.invalidateAll();@b@ }@b@ @b@ /**@b@ * 清空缓存内数据@b@ * 操作基础数据时,清除重新查询@b@ */@b@ public static void clearAll(){@b@ //全部清除缓存@b@ cache.invalidateAll();@b@ }@b@ @b@ /**@b@ * 查看缓存中内容@b@ */@b@ public static ConcurrentMap<String, String> viewCache(){@b@ //查看内容@b@ return cache.asMap();@b@ }@b@ @b@ public static void main(String[] args) throws Exception {@b@ get("t1");@b@ get("t1");@b@ System.out.println(viewCache());@b@ }@b@@b@}
控制台结果
缓存中...@b@xwood_t1@b@xwood_t1@b@{t1=xwood_t1}