java中用好cache

在java开发中经常会遇到下面的代码:

Graph get(Key key) {
    Graph result = get( key );
    if( null == result ) {
        result = createNewGraph( key );
        put( key, result );
    }
    return result;
}

即根据某个Key值,到缓存里查找是否有对应的值,如没有则创建,并把创建的结果保存在缓存里,供下次使用。

上述代码表面上看没有什么问题。但仔细分析一下就会开始多线程访问时,会根据一个Key导致创建了多个Graph。加个锁可以立即解决问题,但今天发现Google提供了更优的方案Google Guava Cache

使用Google Guava Cache上面的代码可以改写为:

private static LoadingCache<Key, Graph> cache = CacheBuilder.newBuilder().build(new CacheLoader<Key, Graph>() {
    @Override
    public Graph load(Key key) throws Exception {
        return createNewGraph( key );
    }

    private Graph createNewGraph(Key key) {
        return new Graph();
    }
});

public static void main(String[] args) {
    try {
        cache.get(new Key(1));
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

这种方案,cache使用起来更方便了。

注意,get方法有一个重载方法,可以在get时定义load方式,如下代码:

final Key key = new Key(1);
cache.get(key, new Callable<Graph>(){
    public Graph call() throws Exception {
        return createNewGraph(key);
    }

    private Graph createNewGraph(Key key) {
        return new Graph();
    }
});

如果Google Guava Cache仅仅只是完成这个功能,那就很一般了。关键是CacheBuilder有很多选项可以来定制Cache的行为,如下:

  • 大小的设置:CacheBuilder.maximumSize(long) CacheBuilder.weigher(Weigher) CacheBuilder.maxumumWeigher(long)
  • 时间:expireAfterAccess(long, TimeUnit) expireAfterWrite(long, TimeUnit)
  • 引用:CacheBuilder.weakKeys() CacheBuilder.weakValues() CacheBuilder.softValues()
  • 明确的删除:invalidate(key) invalidateAll(keys) invalidateAll()
  • 删除监听器:CacheBuilder.removalListener(RemovalListener)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏测试开发架构之路

【总结】梳理下接口功能测试

15930
来自专栏ml

Linux GDB常用命令一栏

Linux GDB 常用命令如下: 1.启动和退出gdb (1)启动:gdb ***:显示一段版权说明; (*** 表示可执行程序名) (2)退出:quit。有...

43340
来自专栏程序员互动联盟

【答疑解惑】如何避免程序崩溃之一

避免程序崩溃,有很多方法,分别针对不同的崩溃原因,我今天想谈谈一种程序员经常碰到的、不管是初学者甚至编程老手都经常犯的错误,就是程序运行时栈的崩溃。 这种错误相...

37380
来自专栏用户2442861的专栏

X皮书之初识Redis(基本操作)

http://www.cnblogs.com/baochuan/archive/2012/10/30/2740600.html

10210
来自专栏pangguoming

ElasticSearch客户端注解使用介绍

The best elasticsearch highlevel java rest api-----bboss

12430
来自专栏Android 研究

Retrofit解析2之使用简介

前面介绍完RESTful之后,我们先来初步认识下Retrofit的使用"姿势"。本文的主要内容如下:

1K30
来自专栏xingoo, 一个梦想做发明家的程序员

JSP基本语法

  记录一下自己复习到的知识点,以后看起来也方便。   指令   JSP中三个指令,page,include,taglib page 用于定义页面相关的信息,...

295100
来自专栏zingpLiu

浅析Python多线程

学习Python多线程的资料很多,吐槽Python多线程的博客也不少。本文主要介绍Python多线程实际应用,且假设读者已经了解多线程的基本概念。如果读者对进程...

29080
来自专栏张善友的专栏

自动类型安全的.NET标准REST库refit

15740
来自专栏一个会写诗的程序员的博客

Springboot Application 集成 OSGI 框架开发

是 Java 类加载层次中最顶层的类加载器,负责加载 JDK 中的核心类库,如:rt.jar、resources.jar、charsets.jar 等

16420

扫码关注云+社区

领取腾讯云代金券