成员

Caffeine提供三种类型的成员加载策略:手动,同步加载和异步加载。

手动

Cache<Key, Graph> cache = Caffeine.newBuilder()
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .maximumSize(10_000)
    .build();
//查找条目,如果找不到则返回null
Graph graph = cache.getIfPresent(key);
//如果在缓存中不存在则查找并计算,如果不可计算则返回null
graph = cache.get(key, k -> createExpensiveGraph(key));
// 添加或更新条目
cache.put(key, graph);
// 移除条目
cache.invalidate(key);

Cache接口允许显示的控制检索,更新和移除条目

可以直接使用cache.put(key,value)将条目插入到缓存中.这将覆盖指定key在缓存中以前的条目.尽量使用cache.get(key,v->value)自动计算并将值插入缓存,以避免其他写入竞争.请注意,如果条目不可计算,则cache.get可能返回Null,如果计算失败,则可能会抛出异常。

也可以使用由cache.asMap()暴露的ConcurrentMap的任何方法对缓存进行更改。

同步加载

LoadingCache<Key, Graph> cache = Caffeine.newBuilder()
    .maximumSize(10_000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(key -> createExpensiveGraph(key));
//如果在缓存中不存在则查找并计算,如果不可计算则返回null
Graph graph = cache.get(key);
//查找并计算不存在的条目
Map<Key, Graph> graphs = cache.getAll(keys);

LoadingCache是使用附加的CacheLoader构建的缓存。

批量查找可以使用getAll方法执行。 默认情况下,getAll将对缓存中没有的每个key分别调用CacheLoader.load。 当批量检索比许多单独的查找更有效时,您可以重写CacheLoader.loadAll。

请注意,您可以编写一个CacheLoader.loadAll实现,为未特别请求的key加载值。 例如,如果计算某个组中的任何key的值将为该组中的所有key提供值,则loadAll可能会同时加载该组的其余部分。

异步加载

AsyncLoadingCache<Key, Graph> cache = Caffeine.newBuilder()
    .maximumSize(10_000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    // Either: 使用包装为异步的同步计算进行构建
    .buildAsync(key -> createExpensiveGraph(key));
    // Or: 构建一个返回future的异步计算
    .buildAsync((key, executor) -> createExpensiveGraphAsync(key, executor));

// 如果缓存中不存在,则查找并异步计算条目
CompletableFuture<Graph> graph = cache.get(key);
//查找并异步计算不存在的条目
CompletableFuture<Map<Key, Graph>> graphs = cache.getAll(keys);

AsyncLoadingCache是一个LoadingCache变体,用于计算Executor上的条目并返回CompletableFuture。 这是允许使用流行的响应式编程模型的缓存。

当计算以同步方式表示更好时,应提供CacheLoader。 当计算异步表示更好时,应该提供一个AsyncCacheLoader,并返回一个CompletableFuture。

synchronous()提供了一个阻塞直到异步计算完成的视图.

默认执行程序是ForkJoinPool.commonPool(),可以通过Caffeine.executor(Executor)覆盖。

Copyright © www.gitbook.com/@vitzhou 2016 all right reserved,powered by Gitbook该文件修订时间: 2018-02-11 03:39:24

results matching ""

    No results matching ""