[Google Guava]-缓存详解



缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存。
Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,
Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。


LoadingCache是附带CacheLoader构建而成的缓存实现。创建自己的CacheLoader通常只需要简单地实现V load(K key) throws Exception方法。

例如,你可以用下面的代码构建LoadingCache:

 @Test
    public void LoadingCache() throws Exception{
        LoadingCache<String,String> cahceBuilder=CacheBuilder
        .newBuilder().maximumSize(10000).expireAfterAccess(10, TimeUnit.MINUTES)
        .build(new CacheLoader<String, String>(){
            @Override
            public String load(String key) throws Exception {        
                return createExpensiveGraph(key);
            }

	   private String createExpensiveGraph(String key) {
		System.out.println("load into cache!");
		return "hello "+key+"!";
	    }
            
        });        
        
        cahceBuilder.get("2");
        cahceBuilder.get("3");
        //第二次就直接从缓存中取出
        cahceBuilder.get("2");
    }

Callable缓存的实现
所有类型的Guava Cache,不管有没有自动加载功能,都支持get(K, Callable<V>)方法。这个方法返回缓存中相应的值,或者用给定的Callable运算并把结果加入到缓存中。
在整个加载方法完成前,缓存项相关的可观察状态都不会更改。这个方法简便地实现了模式"如果有缓存则返回;否则运算、缓存、然后返回"

 @Test
    public void callableCache()throws Exception{
        Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterAccess(10, TimeUnit.MINUTES).build();
        //这里可以手動进行缓存
	cache.put("1", "I'm in chche");
        //-----------------------------------------------
        final String key1 = "1";
        String resultVal = cache.get(key1, new Callable<String>() {  
            public String call() {  
                return createExpensiveGraph(key1);
            }  
        });
       
        System.out.println("1 value : " + resultVal);
        //-------------------------------------------------
        resultVal = cache.get("2", new Callable<String>() {  
            public String call() {  
                return createExpensiveGraph(key1);
            }  
        });  
        System.out.println("2 value : " + resultVal);  
        //==================================================
    }
	
	protected String createExpensiveGraph(String string) {
		return "hello "+string+"!";
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spring_java_gg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值