美文网首页
构建高效且可伸缩的结果缓存

构建高效且可伸缩的结果缓存

作者: zlcook | 来源:发表于2017-08-20 16:51 被阅读19次
  • 使用ConcurrentMap而不使用HashMap可以提高并发性,即避免下面问题:

    • 使用HashMap需要对整个compute加锁,synchronized


      并发性降低
  • 缓存Map中存放Future而不使用最终的结果,可以避免同一个key被计算多次情况。如下:

相同值计算两次
  • 使用ConcurrentMap接口的putIfAbsent方法(“先检查再执行”的原子性操作)而不是put,可以避免重复计算问题,如下:
相同值计算2次
package net.jcip.examples;
import java.util.concurrent.*;
public class Memoizer <A, V> implements Computable<A, V> {
    private final ConcurrentMap<A, Future<V>> cache
            = new ConcurrentHashMap<A, Future<V>>();
    private final Computable<A, V> c;

    public Memoizer(Computable<A, V> c) {
        this.c = c;
    }

    public V compute(final A arg) throws InterruptedException {
        while (true) {
            Future<V> f = cache.get(arg);
            if (f == null) {
                Callable<V> eval = new Callable<V>() {
                    public V call() throws InterruptedException {
                        return c.compute(arg);
                    }
                };
                FutureTask<V> ft = new FutureTask<V>(eval);
                f = cache.putIfAbsent(arg, ft);
                if (f == null) {
                    f = ft;
                    ft.run();  //将会调用c.compute(arg)
                }
            }
            try {
                return f.get();
            } catch (CancellationException e) {
                cache.remove(arg, f);
            } catch (ExecutionException e) {
                throw LaunderThrowable.launderThrowable(e.getCause());
            }
        }
    }
}

相关文章

  • 构建高效且可伸缩的结果缓存

    使用ConcurrentMap而不使用HashMap可以提高并发性,即避免下面问题:使用HashMap需要对整个c...

  • 构建高效可伸缩的结果缓存

    几乎所有的服务器应用程序都会使用某种形式的缓存。中用之前的计算结果能降低延迟,提高吞吐量,但却会消耗更多的内存。这...

  • Java趣谈——如何构建一个高效且可伸缩的缓存

    本集概要: 怎样构建一个线程安全而又高效、可伸缩的缓存? 怎样利用设计模式,把缓存做成通用的工具? 除了synch...

  • Nest.js

    用于构建高效且可伸缩的服务端应用程序的渐进式 Node.js

  • Nest.js基础知识之模块控制器

    简单介绍 用于构建高效且可伸缩Web应用程序的渐进式 Node.js 框架。完美支持 Typescript,面向 ...

  • Nest(一):初识

    译自:https://docs.nestjs.com/。 Nest是一个用于构建高效、可伸缩的Node.js服务器...

  • 在java中构建高效的结果缓存

    在java中构建高效的结果缓存 缓存是现代应用服务器中非常常用的组件。除了第三方缓存以外,我们通常也需要在java...

  • HTML5与CSS3基础-03

    十二 构建响应式网站 制作可伸缩图像的步骤 1.对任何想做成可伸缩图像的图像,在HTML的img标签中省略widt...

  • Akka 设计Reactive System架构指南(A-Z翻译

    摘要 也许您已经听说过Akka,一种用于建造可伸缩,弹性且高效应用程序的工具包,支持Java和Scala编程语言。...

  • Asp.Net Core AddMemoryCache

    前言 通过减少生成内容所需的工作,缓存可以显着提高应用程序的性能和可伸缩性。缓存最适用于不经常更改的数据。缓存生成...

网友评论

      本文标题:构建高效且可伸缩的结果缓存

      本文链接:https://www.haomeiwen.com/subject/amotdxtx.html