我已经使用谷歌番石榴缓存创建了一个缓存
这是我的实现
private final LoadingCache<Long, DistChannel> channelServiceCache = CacheBuilder.newBuilder().maximumSize(50)
.refreshAfterWrite(4, TimeUnit.HOURS).build(new CacheLoader<Long, DistChannel>() {
@Override
public DistChannel load(Long channelId) throws InvalidRequestException, TException {
long start = System.nanoTime();
try {
return channelService.getDistributionChannelById(channelId, SOLR_API_KEY);
} catch (InvalidRequestException e) {
log.error("Cannot look up channel: {}", channelId, e);
String serviceName = StringUtils.isNotBlank(e.getServiceName()) ? e.getServiceName() : CHANNEL_SERVICE;
throw e.setServiceName(serviceName + "." + SERVICE_NAME + "." + hostName);
} finally {
log.info("Channel Service call, ChannelId: {} Time : {}", channelId,
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
}
}
@Override
public ListenableFuture<DistChannel> reload(final Long channelId, final DistChannel oldValue) throws Exception {
ListenableFutureTask<DistChannel> task = ListenableFutureTask.create(new Callable<DistChannel>() {
public DistChannel call() {
long start = System.nanoTime();
try {
return channelService.getDistributionChannelById(channelId, SOLR_API_KEY);
} catch (TException e) {
log.error("Cannot look up channel: {}", channelId, e);
}finally {
log.info("reload Channel Service call, ChannelId: {} Time : {}", channelId,
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
}
return oldValue;
}
});
executorServiceForCache.execute(task);
return task;
}
});
现在在 channelService.getDistributionChannelById 方法中,我需要 paas 两个值,即 channelId 和 apiKey。
目前它的工作正常,因为 apiKey 是恒定的。但是现在 apiKey 被修改为这个常量~时间戳。例如:
SOLR_API_KEY~123456789
所以我的问题是:
如何在不修改密钥的情况下在channelServiceCache.get(key, extraparam here)中再传递一个参数。
我尝试过的事情:我创建了一个 Key 对象,其中将存在我的实际密钥和 apiKey 并将其作为 key 传递给channelServiceCache 但这将终止缓存的目的,因为每次终止都将被视为一个新密钥,因为它包含时间戳在 apikey 中。
有什么办法可以用谷歌番石榴做到这一点?
编辑:我错过的另一件事:
服务将为相同的 channelId 提供相同的输出,API 密钥仅用于身份验证和日志记录以及监控请求计数。但我想这是有道理的,如果我可以从缓存中使用相同的 channelID 服务下一个请求,那么 apiKey 将永远不会被传递给实际的服务(实际的日志记录和监控正在发生。)有没有其他方法来实现这个功能而不实际谷歌番石榴的杀戮目的。