gpt4 book ai didi

java - 如何在 Java 中使用 CacheBuilder 构建和使用缓存

转载 作者:行者123 更新时间:2023-12-01 07:21:54 24 4
gpt4 key购买 nike

我有一个方法可以提取大量数据。由于数据集很大且所需的计算量很大,这可能会花费相当多的时间。执行此调用的方法将被多次使用。结果列表每次都应返回相同的结果。话虽如此,我想缓存结果,所以我只需要做一次计算。我应该使用 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() 方法的结果添加到缓存中,以便可以在下一次迭代中使用它,而无需重做任何计算。

最佳答案

  1. 您只想缓存单个值,即有效值列表。使用 Guava 'Suppliers.memoizeWithExpiration(Supplier delegate, long duration, TimeUnit unit)

  2. 每个有效值仅存在一次。所以你的列表本质上是一个集合。通过 HashSet(或者 Guava 中更有效的变体)支持它。这样,contains() 就是一个哈希表查找,而不是列表内的顺序搜索。

关于java - 如何在 Java 中使用 CacheBuilder 构建和使用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34747947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com