public class Test2 {public static void main(String[] args) throws Exception {LoadingCache<Integer, String> cache = CacheBuilder.newBuilder()//设置并发级别为8,并发级别是指可以同时写缓存的线程数.concurrencyLevel(8)//设置缓存容器的初始容量为10.initialCapacity(10)//设置缓存最大容量为100,超过100之后就会按照LRU最近虽少使用算法来移除缓存项.maximumSize(100)//是否需要统计缓存情况,该操作消耗一定的性能,生产环境应该去除.recordStats()//设置写缓存后n秒钟过期.expireAfterWrite(17, TimeUnit.SECONDS)//设置读写缓存后n秒钟过期,实际很少用到,类似于expireAfterWrite//.expireAfterAccess(17, TimeUnit.SECONDS)//只阻塞当前数据加载线程,其他线程返回旧值//.refreshAfterWrite(13, TimeUnit.SECONDS)//设置缓存的移除通知.removalListener(new RemovalListener<Integer, String>() {@Overridepublic void onRemoval(RemovalNotification<Integer, String> notification) {System.out.println("消除一个");}})//build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存.build(new DemoCacheLoader());cache.put(1,"qwe");//缓存状态查看System.out.println(cache.size());System.out.println(cache.get(1));System.out.println(cache.get(2));}/*** 随机缓存加载,实际使用时应实现业务的缓存加载逻辑,例如从数据库获取数据*/public static class DemoCacheLoader extends CacheLoader<Integer, String> {@Overridepublic String load(Integer key) throws Exception {System.out.println(Thread.currentThread().getName() + " 加载数据开始");TimeUnit.SECONDS.sleep(8);Random random = new Random();System.out.println(Thread.currentThread().getName() + " 加载数据结束");return "value:" + random.nextInt(10000);}}
}