gpt4 book ai didi

java - 如何将 map 存储在 Guava 缓存中

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:11 25 4
gpt4 key购买 nike

我有一个 Map<Range<Double>, String>检查特定 Double 的位置值(分数)映射到 String (等级)。最终用户希望能够动态更改此映射,从长远来看,我们希望有一个基于 Web 的 GUI他们控制这个但短期内他们很高兴文件在 S3 中并在需要更改时对其进行编辑。我不想打 S3对于每个请求并希望缓存它,因为它不会太频繁地更改(每周一次左右)。我也不想更改代码并退出我的服务。

这是我想出的-

public class Mapper() {
private LoadingCache<Score, String> scoreToLevelCache;

public Mapper() {
scoreToLevelCache = CacheBuilder.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(new CacheLoader<Score, String>() {
public String load(Score score) {
Map<Range<Double>, String> scoreToLevelMap = readMappingFromS3(); //readMappingFromS3 omitted for brevity
for(Range<Double> key : scoreToLevelMap.keySet()) {
if(key.contains(score.getCount())) { return scoreToLevelMap.get(key); }
}
throw new IllegalArgumentException("The score couldn't be mapped to a level. Either the score passed in was incorrect or the mapping is incorrect");
}
});
}

public String getContentLevelForScore(Score Score) {
try {
return scoreToLevelCache.get(Score);
} catch (ExecutionException e) { throw new InternalServerException(e); }
}
}

这种方法的明显问题在于 load我做的时候的方法 Map<Range<Double>, String> scoreToLevelMap = readMappingFromS3();对于每个键,我都会一遍又一遍地加载整个 map 。这不是性能问题,但当大小增加时可能会成为一个问题,无论如何这都不是一种有效的方法。

我认为将整个 map 保存在缓存中会更好,但我不确定如何在此处执行此操作。任何人都可以帮助解决这个问题或建议一种更优雅的方法来实现这一目标。

最佳答案

Guava 对于“只包含一个值的缓存”有不同的机制;它叫做Suppliers.memoizeWithExpiration .

private Supplier<Map<Range<Double>, String> cachedMap = 
Suppliers.memoizeWithExpiration(
new Supplier<Map<Range<Double>, String>() {
public Map<Range<Double>, String> get() {
return readMappingFromS3();
}
}, 10, TimeUnit.MINUTES);

public String getContentLevelForScore(Score score) {
Map<Range<Double>, String> scoreMap = cachedMap.get();
// etc.
}

关于java - 如何将 map 存储在 Guava 缓存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28754875/

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