- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个方法可以提取大量数据。由于数据集很大且所需的计算量很大,这可能会花费相当多的时间。执行此调用的方法将被多次使用。结果列表每次都应返回相同的结果。话虽如此,我想缓存结果,所以我只需要做一次计算。我应该使用 CacheBuilder 类。我的脚本本质上是这样的:
class CheckValidValues implements AValidValueInterface {
private ADataSourceInterface dataSource;
public CheckValidValues(ADataSourceInterface dataSource) {
this.dataSource = dataSource;
}
@Override
public void validate(String value) {
List<?> validValues = dataSource.getValidValues();
if (!validValues.contains(value)) {
// throw an exception
所以我什至不确定应该将缓存方法放在哪里(即在 CheckValidValues 类中或 dataSource 中的 getValidValues() 方法中)。此外,我也不完全确定如何将代码添加到其中之一没有多次实例化缓存的方法。这是我尝试采用的路线,但不知道它是否正确。在 List validValues = dataSource.getValidValues() 行上方添加:
LoadingCache<String, List<?>> validValuesCache = CacheBuilder.newBuilder()
.expireAfterAccess(30, TimeUnit.SECONDS)
.build(
new CacheLoader<String, List<?>>() {
public List<?> load(@Nonnull String validValues) {
return valuesSupplier.getValidValues();
}
}
);
然后,我想我可以通过以下方式获得该值:
validValuesCache.get("validValues");
我认为应该发生的是,它将执行 getValidValues 命令并将其存储在缓存中。但是,如果多次调用此方法,那么对我来说,这意味着每次都会创建一个新的缓存。
知道我应该为此做什么吗?我只是想将 getValidValues() 方法的结果添加到缓存中,以便可以在下一次迭代中使用它,而无需重做任何计算。
最佳答案
您只想缓存单个值,即有效值列表。使用 Guava 'Suppliers.memoizeWithExpiration(Supplier delegate, long duration, TimeUnit unit)
每个有效值仅存在一次。所以你的列表本质上是一个集合。通过 HashSet(或者 Guava 中更有效的变体)支持它。这样,contains() 就是一个哈希表查找,而不是列表内的顺序搜索。
关于java - 如何在 Java 中使用 CacheBuilder 构建和使用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34747947/
这个问题已经有答案了: Spark 1.5.1, Cassandra Connector 1.5.0-M2, Cassandra 2.1, Scala 2.10, NoSuchMethodError
有人可以向我解释如何正确使用 Guava CacheBuilder。 如果数据不可访问,getFromNetwork() 应该引发异常还是返回 null?我应该引发执行异常并使用 guavaCache
从我的应用程序日志中,我觉得在缓存键过期后没有立即调用removeListener。这会在下面的场景中产生问题 缓存配置: SimpleCacheManager simpleCacheManager
我正在尝试创建一个简单的缓存,可以在其中存储 map 中的一些数据元素。我需要将这些数据保留大约 16 小时左右,之后我可以让旧项目过期。我正在实例化我的 LoadingCache: cache =
嗨,我是谷歌 Guava 集合的新手,所以我需要会过期一段时间的集合。所以我编写了以下代码,但它不会在过期时间后删除数据。任何人都可以告诉我代码的问题是什么。 Cache cache = CacheB
我想弄清楚您在 Guava CacheBuilder maximumSize() 中指定的数字代表什么。 假设我的代码中有这样的东西, Cache programCache = CacheBuilde
我想用 Guava CacheBuilder ,但无法找到任何明确的示例来实现这一点。 文档说明了以下代码: LoadingCache graphs = CacheBuilder.newBuilder
请告诉我哪里遗漏了什么。 我在 DataPool 中有一个由 CacheBuilder 构建的缓存。 DataPool 是一个单例对象,各种线程都可以获取其实例并对其进行操作。现在我有一个线程生成数据
我想要:当实体因超时到期而被移除时收到通知。 我尝试过: 设置删除监听器。 问题: 删除监听器似乎无法正常工作。它仅在我将新项目放入缓存时起作用(请参见下面的代码) 问题: 如何在不放置新项目的情况下
我正在尝试使用 Stash 插件的代码片段,但编译器一直给我一个我似乎无法解决的错误。它使用 com.google.common.cache.Cache (Guava) static final R
我已经创建了一个 Guava(一个包含有用的东西的库,几乎可以在任何 Java 项目中使用,包括用于不可变集合、函数式编程、I/O 等等的库)基于 CacheBuilder 的缓存 LoadingC
我目前在我的应用程序中使用 ConcurrentHashMap,但我需要添加在超时期限后有效地使条目过期的功能 (expireAfterWrite),并在删除条目时通知删除监听器。 我看到 Cache
Guava CacheBuilder 只使用一个 JVM。我想使用 CacheBuilder 接口(interface)从 redis 加载数据,然后 redis 依次从 MySQL 加载数据。 我该
我想使用这里推荐的 CacheBuilder: Java time-based map/cache with expiring keys 但是我不明白什么时候 Guava 知道条目会过期。 Guava
我想知道目前是否有一种方法可以使用 Guava MapMaker 或将使用 CacheBuilder 来提供计算缓存是否在最大大小范围内的函数? 看起来目前的驱逐只是基于缓存中的元素数量与 .maxi
我需要获取慢速方法的结果slowResult()对于类 Something 的实例。单独缓存并没有什么帮助,因为实例几乎不会重复。幸运的是,我知道结果实际上只取决于一些容易获得的Attributes的
我有一个方法可以提取大量数据。由于数据集很大且所需的计算量很大,这可能会花费相当多的时间。执行此调用的方法将被多次使用。结果列表每次都应返回相同的结果。话虽如此,我想缓存结果,所以我只需要做一次计算。
我尝试使用 MapMaker/CacheBuilder 制作缓存,但我不明白如何正确处理空值。 ConcurrentMap graphs = new MapMaker() .concu
从昨天开始尝试上传我的应用程序的新版本(仅更改了客户端代码),出现以下异常(应用程序 ID 为“riparautonline-hrd”): Uncaught exception from servle
我不习惯处理 Java 中的软引用和弱引用,但我理解其中的原理,因为我习惯处理像 Gemfire 这样的数据网格,它在内存已满时提供溢出到硬盘功能,可能使用软引用或我猜是类似的东西。 我在 Guava
我是一名优秀的程序员,十分优秀!