接下来几篇给大家分享一下缓存相关的内容,包括但不限于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<String, SkuCache> loadingCache = CacheBuilder.newBuilder()
.expireAfterAccess(10, TimeUnit.SECONDS)
.build(new CacheLoader<String, SkuCache>() {
@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等等,有时间大家可以去用用,会发现你的代码会简单易懂很多。正如,磨刀不误砍材工,只有把基础的信息掌握,用的时候才能临危不惧。