在平时的开发中,我们会经常用到字典,比如我们数据库里面存的是设备编码,展示需要的是设备名称;数据库中存的是用户id,展示的是用户名称。这样的字段我们会频繁的调用,那么就会频繁的查询数据库,为了保证访问速度,我们会使用缓存。但是如果使用Redis之类的中间件缓存,又有点大材小用。当然我们也可以自己将需要的数据存入Map中,但是要考虑Map的预计容量,数据缓存的时间等等。这样对Map的设计就比较麻烦。

这里我推荐Google的类库框架Guava里面的本地缓存。

使用前我们先引用Guava的Maven依赖:

<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency>

我们先来写一个省会的实体类Province:

@Data @ToString @AllArgsConstructor @NoArgsConstructor publicclassProvince{ //省会名称 privateStringname; //省会编码如:PR001 privateStringcode; }

这里定义两个字段,省会名称和省会编码。一般入库存的是编码code,展示的时候我们需要去专门的表里面查询获取name。

我们再来定义一个缓存失效的监听器CustomizeRemovalListener:

publicclassCustomizeRemovalListenerimplementsRemovalListener<String,Province>{ @Override publicvoidonRemoval(RemovalNotification<String,Province>removalNotification){ Stringreason=String.format("key=%s,value=%s,reason=%s",removalNotification.getKey(),removalNotification.getValue(),removalNotification.getCause()); System.out.println(reason); } }

当我们手动失效缓存,或者过期时间到了,就会被监听到。控制台就会打印出reason。onRemoval()方法可以根据业务需求进行编写。

我们来使用缓存:

google浏览器的清理缓存方式(Google的这个本地缓存真好用)(1)

如上代码,我们调用loadingCache.get()方法时,会先在缓存中查找,如果缓存中没有,会执行这段代码:

//如果找不到元素,会调用这里 @Override publicProvinceload(Strings){ //实际情况这里就是查库 System.out.println("查了数据库哦"); returngetDataFromDb(); }

我们就在这段代码中查库。在图示代码中,我们先创建一个初始缓存:

LoadingCache<String,Province>loadingCache=CacheBuilder.newBuilder() .maximumSize(1000)//容量 .expireAfterWrite(3,TimeUnit.SECONDS)//过期时间 .removalListener(newCustomizeRemovalListener())//失效监听器 .build(cacheLoader);

这里创建了缓存的初始容量、过期时间、以及缓存失效后的监听功能。

我们将数据存入缓存中:

loadingCache.put("PR001",getDataFromDb());

前面3次获取都是从缓存loadingCache获取值,当线程睡眠4秒,超过过期时间,缓存会失效,触发监听器。第4次获取就会从load(String s)中获取。

控制台打印结果如下:

第一次获取:Province(name=北京, code=PR001) 第二次获取:Province(name=北京, code=PR001) 第三次获取:Province(name=北京, code=PR001) key=PR001,value=Province(name=北京,code=PR001),reason=EXPIRED 查了数据库哦 第四次获取:Province(name=北京, code=PR001)

这段代码

key=PR001,value=Province(name=北京,code=PR001),reason=EXPIRED

显示缓存因超时而过期。

当然Guava还有很多功能哦,感兴趣的童鞋可以看看我写的这篇文章:

我用Java框架Guava解决了空指针异常问题

(https://blog.csdn.net/wujialv/article/details/108314430?ops_request_misc=%7B%22request%5Fid%22%3A%22160643779119725271078708%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fblog.%22%7D&request_id=160643779119725271078708&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-1-108314430.pc_v1_rank_blog_v1&utm_term=Guava&spm=1018.2118.3001.4450)

当然市面上还有很多本地缓存框架,比如Caffeine(Guava缓存的升级版)、Ehcache等。有兴趣的童鞋可以去了解下。

,