Google的这个本地缓存真好用

3 篇文章 0 订阅

在平时的开发中,我们会经常用到字典,比如我们数据库里面存的是设备编码,展示需要的是设备名称;数据库中存的是用户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
public class Province {
    //省会名称
    private String name;
    //省会编码 如:PR001
    private String code;
}

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

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

public class CustomizeRemovalListener implements RemovalListener<String, Province> {
    @Override
    public void onRemoval(RemovalNotification<String, Province> removalNotification) {
        String reason = String.format("key=%s,value=%s,reason=%s", removalNotification.getKey(), removalNotification.getValue(), removalNotification.getCause());
        System.out.println(reason);
    }
}

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

我们来使用缓存:

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

// 如果找不到元素,会调用这里
@Override
public Province load(String s) {
    //实际情况这里就是查库
    System.out.println("查了数据库哦");
    return getDataFromDb();
}

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

LoadingCache<String, Province> loadingCache = CacheBuilder.newBuilder()
        .maximumSize(1000) // 容量
        .expireAfterWrite(3, TimeUnit.SECONDS) // 过期时间
        .removalListener(new CustomizeRemovalListener()) // 失效监听器
        .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还有很多功能哦,感兴趣的童鞋可以看看我写的这篇文章:

[程序员的福音——Guava](程序员的福音——Guava (qq.com))

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

往期推荐

扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料

  1. 回复"java" 获取java电子书;

  2. 回复"python"获取python电子书;

  3. 回复"算法"获取算法电子书;

  4. 回复"大数据"获取大数据电子书;

  5. 回复"spring"获取SpringBoot的学习视频。

  6. 回复"面试"获取一线大厂面试资料

  7. 回复"进阶之路"获取Java进阶之路的思维导图

  8. 回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

  9. 回复"总结"获取Java后端面试经验总结PDF版

  10. 回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

  11. 回复"并发导图"获取Java并发编程思维导图(xmind终极版)

另:点击【我的福利】有更多惊喜哦。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值