-1

我已经使用谷歌番石榴缓存创建了一个缓存

这是我的实现

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 将永远不会被传递给实际的服务(实际的日志记录和监控正在发生。)有没有其他方法来实现这个功能而不实际谷歌番石榴的杀戮目的。

4

1 回答 1

3

如果每个通道 id 和 API 密钥的服务输出不同,则 API 密钥需要是缓存密钥的一部分。

如果无论使用什么 API 密钥,输出都是相同的,那么您可以使用任何 API 密钥或始终使用相同的 API 密钥。

从调用方传递 API 密钥,但缓存该值没有任何意义,或者本质上与随机选择 API 密钥相同。一旦值在缓存中,您将返回使用与前一个调用者不同的 API 密钥检索的结果。

于 2016-06-21T12:54:58.043 回答