【发布时间】:2015-04-29 13:31:10
【问题描述】:
我有一个Map<Range<Double>, String>,它检查特定Double 值(分数)映射到String(级别)的位置。最终用户希望能够动态更改此映射,从长远来看,我们希望有一个基于 Web 的 GUI,他们可以在其中控制它,但从短期来看,他们很高兴有一个文件在 @ 987654325@ 并在需要更改时进行编辑。我不想为每个请求点击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();
对于每个键,我一遍又一遍地加载整个地图。这不是性能问题,但是当大小增加时它可能会成为一个问题,无论如何这不是一种有效的方法。
我认为将整个地图保存在缓存中会更好,但我不确定如何在此处执行此操作。任何人都可以提供帮助或建议一种更优雅的方式来实现这一点。
【问题讨论】:
标签: java caching dictionary guava