首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Google的这个本地缓存真好用

Google的这个本地缓存真好用

作者头像
Lvshen
发布2022-05-05 19:05:10
发布2022-05-05 19:05:10
6850
举报

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

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

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

代码语言:javascript
复制
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

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

代码语言:javascript
复制
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Province {
    //省会名称
    private String name;
    //省会编码 如:PR001
    private String code;
}

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

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

代码语言:javascript
复制
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()方法时,会先在缓存中查找,如果缓存中没有,会执行这段代码:

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

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

代码语言:javascript
复制
LoadingCache<String, Province> loadingCache = CacheBuilder.newBuilder()
        .maximumSize(1000) // 容量
        .expireAfterWrite(3, TimeUnit.SECONDS) // 过期时间
        .removalListener(new CustomizeRemovalListener()) // 失效监听器
        .build(cacheLoader);

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

我们将数据存入缓存中:

代码语言:javascript
复制
loadingCache.put("PR001", getDataFromDb());

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

控制台打印结果如下:

代码语言:javascript
复制
第一次获取: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)

这段代码

代码语言:javascript
复制
key=PR001,value=Province(name=北京, code=PR001),reason=EXPIRED

显示缓存因超时而过期。

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lvshen的技术小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档