首页

通过Google的Guava基于callback、LoadingCache两种不同方式实现虚拟机内存缓存Cache机制示例demo

标签:CacheBuilder,内存缓存管理,google,guava缓存示例,Optional,有效期,expireAfterWrite,callback,LoadingCache     发布时间:2018-01-18   

一、前言

基于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}