Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有可能以咖啡因的形式获取候选逐出密钥集?_Java_Caching_Akka_Caffeine - Fatal编程技术网

Java 是否有可能以咖啡因的形式获取候选逐出密钥集?

Java 是否有可能以咖啡因的形式获取候选逐出密钥集?,java,caching,akka,caffeine,Java,Caching,Akka,Caffeine,我试图使用缓存来维护基于请求类型的可路由服务器列表 LoadingCache<Request, ActorRef> serversByRequestType = Caffeine.newBuilder() .writer(new CacheWriter<RequestType, ActorRef>() { @Override public void write(RequestType req, ActorRef server) { // We n

我试图使用缓存来维护基于请求类型的可路由服务器列表

LoadingCache<Request, ActorRef> serversByRequestType = Caffeine.newBuilder()
  .writer(new CacheWriter<RequestType, ActorRef>() {

    @Override public void write(RequestType req, ActorRef server) {
      // We need to handle this type of request now.
      //
      server.tell(StartUp(req))
    }

    @Override public void delete(RequestType req, ActorRef server, RemovalCause cause) {
      // This req type can no longer be handled, so remove from
      // routable servers.
      //
      server.tell(ShutDown(req))
    }

  })
  .build();
如果启动的服务器不超过n台,则必须同步删除,从而从缓存中关闭一台服务器,然后添加,从而在缓存中启动同一台服务器,即更改服务器可以处理的流量

在上面的代码中,如果没有阻塞,就没有办法做到这一点

在理想情况下,删除必须在缓存中添加之前发生,这样我就可以异步关闭服务器并等待ShutdowServer事件。。。但是没有办法从write方法中接收这个信号,write方法必须知道何时开始。换句话说,我想向服务器发送一个SwitchServerTrafficfrom:RequestType,to:RequestType,其中from是被逐出的键,to是被添加的键

如果我有权访问候选逐出集:当请求传入时,如果其类型不在缓存中且缓存已满,我可以从逐出集中选择一个元素并关闭其服务器,然后将请求类型同步添加到缓存中


有没有办法访问咖啡因中的候选人驱逐集?如果没有,是否有其他方法可以解决此问题?

您可以猜测逐出顺序中的项目,但这无法保证。该策略是非确定性的,并且概率性有助于防止HashDoS攻击。一般来说,驱逐政策的低级细节不公开,以允许算法改进

Map<K, V> coldest = cache.policy().eviction().get().coldest(count);
如果删除发生在逐出之前,则要求所有写入都由独占锁保护,或者可以同时计算策略。前者将是一个瓶颈,而后者将导致更差的命中率,例如使用随机抽样。相反,缓存使用带有中间缓冲区的记录和重播策略,这吸收了并发的大部分惩罚

默认情况下,逐出是对面向用户的调用异步执行的,因此对CacheWriterdelete的大多数调用都是隐藏的。但是,如果该呼叫费用高昂,则会延迟下一个项目的驱逐


不幸的是,由于您的场景对您的需求有着独特的限制,因此很难不设身处地地地提供建议。您可能会发现Cache.asMap中的计算方法对于解决方案的最终外观非常有用。

接受即时答案,对警告和提示进行投票。干杯,本。希望有人有更好的办法来解决你的问题,你可以奖励他们:这是一个棘手的问题!如果我能想出一个好的解决方案,我会尝试与大家分享。