我有一个检查特定的Double值(分数)映射到一个String(级别)的Map, 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();
时,每个键都会重复加载整个映射。虽然这不是性能问题,但当大小增加时可能会变成一个性能问题,无论如何,这都不是一种有效的方法。我认为将整个映射保存在缓存中会更好,但我不确定如何在这里做到这一点。有人可以帮忙解决这个问题或者提出更优雅的解决方案吗?