博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存篇(一)- Guava
阅读量:2442 次
发布时间:2019-05-10

本文共 2061 字,大约阅读时间需要 6 分钟。

接下来几篇给大家分享一下缓存相关的内容,包括但不限于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://lqnqb.baihongyu.com/

你可能感兴趣的文章
[分享]后门清除完全篇(转)
查看>>
用php在linux下连接mssql2000(转)
查看>>
让你的Linux支持WEB修改密码(转)
查看>>
MYSQL的master/slave数据同步配置(转)
查看>>
一个完整的ftp远程批量shell(转)
查看>>
Vsftpd匿名无法上传,配置如下,帮忙找下原因,谢谢~!(转)
查看>>
crontab命令简介(转)
查看>>
C++中的静态联编和动态联编介绍(转)
查看>>
带有农历的日历(QT版本1752-2100)(转)
查看>>
LINUX的系统内核空间的保护(转)
查看>>
在Visual C++中利用UDL文件建ADO连接(转)
查看>>
C++编程批评系列 继承的本质(转)
查看>>
unix下编写socket程序的一般步骤(转)
查看>>
共享软件中注册部分的简单实现(转)
查看>>
RedHat Linux 9下所有权和许可权限(转)
查看>>
C++程序设计从零开始之语句(转)
查看>>
利用Apache+PHP3+MySQL建立数据库驱动的动态网站(转)
查看>>
C#中实现DataGrid双向排序(转)
查看>>
利用C语言小程序来解决大问题(转)
查看>>
简单方法在C#中取得汉字的拼音的首字母(转)
查看>>