缓存篇(一)- Guava

接下来几篇给大家分享一下缓存相关的内容,包括但不限于Guava,JetCache和Spring Cache等。

      Guava产生的背景

      最常见最简单的方式就是我们使用HashMap或者ConcurrentHashMap,在内存中缓存数据,通过key存放value,通过key读取我们需要的value数据。但是这里存在一个问题,value是会过期的。所以我们还得需要设置一个定时器,根据业务和数据变化要求,每隔一段时间进行缓存更新,保证读取的是更新的value。另外如果需要对缓存的数据做更精准的失效控制,还得自己写一套回收策略的代码,这相对来说是很麻烦的。但是Guava已经帮你考虑到这些了。

     Guava的使用场景

     Guava也并不是万能的,在使用之前我们先说说使用场景,看看业务中使用Guava缓存是否能够解决问题。

     场景1:Guava属于本地内存缓存,非分布式缓存,适用于对数据实时性不高,但也有一定要求。所以使用Guava就需要牺牲一定的内存空间。

     场景2:本地缓存至少会查询到1次,保证Guava起码是能够真正起到缓存加速作用的。

 

     Guava案例分析

    @Test
    public void testCacheUse() throws Exception{
        LoadingCache loadingCache = CacheBuilder.newBuilder()
                .expireAfterAccess(10, TimeUnit.SECONDS)
                .build(new CacheLoader() {
                    @Override
                    public SkuCache load(String key) {
                        SkuCache skuCache = new SkuCache();
                        skuCache.setSkuCode(key);
                        skuCache.setSkuId(key);
                        skuCache.setRealQuantity(100L);
                        return skuCache;
                    }
                });

        SkuCache skuCache = loadingCache.get("sku");
        System.out.println(skuCache);
        skuCache.setSkuCode(skuCache.getSkuCode() + "-modified");
        SkuCache skuCache2 = loadingCache.get("sku");
        System.out.println(skuCache2);

    }

    @Data
    public class SkuCache {
        private String skuId;
        private String skuCode;
        private Long realQuantity;
    }

 

这里我们定义了缓存对象SkuCache,希望前端页面在查询热点sku的信息时,起到缓存加速的效果。

首先通过CacheBuilder.newBuilder()创建一个CacheBuilder对象,CacheBuilder提供了两个失效策略expireAfterAccess和expireAfterWrite,分别代表访问一段时间后失效和写入一段时间后失效。当然,如果你想让缓存每隔一段时间自断刷新,可以使用refreshAfterWrite方法。这里不做过多的测试。

Guava使用的注意事项

Guava的缓存是在内存中实现,所以在同一段未失效期内,一个缓存对象都是在一个内存中存在,如果取出来之后,设置了新值, 那么Guava缓存中的值也将改变。正如测试案例中的操作,将会输出一下内容。

SkuCache(skuId=sku, skuCode=sku, realQuantity=100)
SkuCache(skuId=sku, skuCode=sku-modified, realQuantity=100)

这里只是给大家简单介绍了一下Guava的简单用法,但是Guava除了缓存之外,还有很多强大方便的功能,例如集合、并发工具和IO等等,有时间大家可以去用用,会发现你的代码会简单易懂很多。正如,磨刀不误砍材工,只有把基础的信息掌握,用的时候才能临危不惧。

 

参考文章:http://ifeve.com/google-guava-cachesexplained/

你可能感兴趣的:(网络编程)