Caffeine - Caches - Population

2024-04-25 18:48
文章标签 caffeine population caches

本文主要是介绍Caffeine - Caches - Population,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Caffeine - Caches - Population

    • 填充策略
      • 手动加载
      • 自动加载
      • 异步手动加载
      • 异步自动加载

填充策略

Caffeine提供了4中填充策略:手动加载、同步加载以及异步变体(异步手工、异步加载)。

手动加载

Cache<Key, Graph> cache = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).maximumSize(10_000).build();// Lookup an entry, or null if not found
Graph graph = cache.getIfPresent(key);
// Lookup and compute an entry if absent, or null if not computable
graph = cache.get(key, k -> createExpensiveGraph(key));
// Insert or update an entry
cache.put(key, graph);
// Remove an entry
cache.invalidate(key);

Cache接口允许对缓存条目进行明确的检索、更新以及无效操作。

可以通过cache.put(key, value)插入条目,他会覆盖指定key在缓存内的原有值。为了避免与其他写操作竞争,我们推荐使用cache.get(key, k -> value)方法自动计算并将value写入缓存。注意,如果条目不可计算,cache.get可能返回null;如果计算失败,这抛出异常。

通过Cache.asMap()获取ConcurrentMap视图,所有基于ConcurrentMap方法的改变都会反映到缓存上。

自动加载

LoadingCache<Key, Graph> cache = Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(10, TimeUnit.MINUTES).build(key -> createExpensiveGraph(key));// Lookup and compute an entry if absent, or null if not computable
Graph graph = cache.get(key);
// Lookup and compute entries that are absent
Map<Key, Graph> graphs = cache.getAll(keys);

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

可以使用getAll方法执行批量查询。默认情况下,对于缓存中不存在的每个key,getAll都会对CacheLoader.load发出单独的调用。当批量检索比多个单独查找更为有效时,可以重写CacheLoader.loadAll方法来实现它。

注意,您可以编写CacheLoader.loadAll实现来加载那些未明确请求的key的值。例如,如果计算某个组中任何key的值为您提供了该组中所有key的值,loadAll可能会同时加载改组中的其余key。???

异步手动加载

AsyncCache<Key, Graph> cache = Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).maximumSize(10_000).buildAsync();// Lookup and asynchronously compute an entry if absent
CompletableFuture<Graph> graph = cache.get(key, k -> createExpensiveGraph(key));

AsyncCache是Cache的变体,它通过Executor计算条目并返回CompletableFuture。这允许通过利用流行的响应式编程模型使用缓存。

synchronous() 视图提供了一个Cache,它会一直阻塞直到所有的异步计算完成为止。

通过AsyncCache.asMap()获取ConcurrentMap视图,所有基于ConcurrentMap方法的改变都会反映到缓存上。

默认的Executor是 ForkJoinPool.commonPool(),它可以通过Caffeine.executor(Executor)方法重写。

异步自动加载

AsyncLoadingCache<Key, Graph> cache = Caffeine.newBuilder().maximumSize(10_000).expireAfterWrite(10, TimeUnit.MINUTES)// Either: Build with a synchronous computation that is wrapped as asynchronous .buildAsync(key -> createExpensiveGraph(key));// Or: Build with a asynchronous computation that returns a future.buildAsync((key, executor) -> createExpensiveGraphAsync(key, executor));// Lookup and asynchronously compute an entry if absent
CompletableFuture<Graph> graph = cache.get(key);
// Lookup and asynchronously compute entries that are absent
CompletableFuture<Map<Key, Graph>> graphs = cache.getAll(keys);

AsyncLoadingCache是使用附加的AsyncCacheLoader构件的AsyncCache。

当值的计算最好采用同步方式进行的时候,应提供CacheLoader。与之对应的,当值的计算是异步进行并且返回CompletableFuture时,应提供AsyncCacheLoader。

这篇关于Caffeine - Caches - Population的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935496

相关文章

CodeForces 416D Population Size

题意: 一串数字  有一些元素可以替换成任何正数  问  最少用几个等差数列可以覆盖整串数字 思路: 贪心  分类讨论 假设a[x]和a[y]两个数字是已知的  那么我们先判断他们两个中间可否形成等差数列 如果不行  则  让x到y-1形成一个等差数列 如果行  再判断a[x]是否已经在前面的一个等差数列中              如果不在  那么用a[y]和a[x]求出公差

[Matsim]Matsim学习笔记-population.xml的创建

学习需求 在利用matsim实现交通模拟时,需要把模拟的乘客出行数据替换成自己的,如何进行替换呢? 带着这个问题,调研学习matsim,实现population.xml的生成 调研笔记 幸运的发现matsim中实现了很多的writer工具类,population的生成就需要用到PopulationWriter这个工具类。 population.xml示例代码: <population><!--

Linux - 利用/proc/sys/vm/drop_caches实现手工清理系统缓存

文章目录 现象`buff/cache` 的作用和含义分析 `buff/cache` 占用大量内存的原因是否需要清理缓存及其方法 命令清理缓存方法1. `sync` 命令2. `echo 3>/proc/sys/vm/drop_caches` 命令 注意事项小结 现象 使用free 命令,看到 buff/cache 占用很多 。 free 命令用于显示系统内存的使用情

「Spring 缓存最佳实践」Caffeine 与 Redis 分层缓存架构

在现代的应用程序中,缓存是提升系统性能和响应速度的关键手段。Spring 框架为我们提供了非常强大的缓存抽象,使我们可以方便地集成并使用各种缓存技术。本文将重点介绍如何在 Spring 应用中构建基于 Caffeine 和 Redis 的分层缓存架构,并分享一些最佳实践。 缓存层次设计 在构建缓存解决方案时,通常采用分层缓存的设计模式。将本地缓存(如 Caffeine)作为一级缓存,并将远程缓

统计中的oracle和population什么意思?

oracle 在统计学的上下文中,“oracle” 这个词并不是一个标准术语,至少不像在数据库技术中那样具有特定且广泛认可的定义。不过,“oracle” 一词在一般意义上指的是提供智慧、知识或绝对正确答案的源头,源于古希腊宗教中能够传达神的旨意和预言的神谕。 在统计或机器学习领域,“oracle” 有时会被借用作为一种理想化概念,用来描述理论上可以完美知道或预测某些信息的假设实体。例如,在评估

Caffeine - Caches - Writer

Caffeine - Caches - Writer 写入器可能的用例写入模式分层同步监听器 参考 写入器 LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().writer(new CacheWriter<Key, Graph>() {@Override public void write(Key key, Grap

Caffeine - Caches - Refresh

Caffeine - Caches - Refresh 刷新 刷新 LoadingCache<Key, Graph> graphs = Caffeine.newBuilder().maximumSize(10_000).refreshAfterWrite(1, TimeUnit.MINUTES).build(key -> createExpensiveGraph(key));

Caffeine - Caches - Removal

Caffeine - Caches - Removal 移除明确移除移除监听 移除 术语: 剔除是指基于剔除策略的移除无效只是被调用者手工移除移除是剔除和无效的后续操作 明确移除 在任何时候,您都可以显式的使缓存条目无效,而不必等待条目被剔除。 // individual keycache.invalidate(key)// bulk keyscache.inv

Caffeine - Caches - Eviction

Caffeine - Caches - Eviction 剔除策略基于容量的剔除基于时间的剔除基于引用的剔除 剔除策略 Caffeine提供了三种类型的提出方式:基于容量的剔除、基于时间的剔除和基于引用的剔除。 基于容量的剔除 // Evict based on the number of entries in the cacheLoadingCache<Key, Gr

Caffeine - Home

Caffeine - Home 1. 缓存条目自动加载2. 缓存条目异步加载3. 根据访问频率和新近度的剔除策略4. 基于最后访问时间的剔除策略5. 条目删除(移除)通知6. 条目写入传播到外部资源7. 缓存累积访问量统计 Caffeine是基于Java 8的高性能缓存库,可提供接近最佳的命中率。 缓存与ConcurrentMap类似,但又不尽相同。其中最根本的区别是Concur