gpt4 book ai didi

java - 是否有可能在 Caffeine 中获取候选被逐出 key 集?

转载 作者:行者123 更新时间:2023-12-02 11:08:20 24 4
gpt4 key购买 nike

我正在尝试使用缓存来根据请求类型维护可路由服务器的列表。

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 个,同步从缓存中删除(并因此关闭)服务器非常重要,然后再添加(因此缓存中同一服务器的旋转(即更改服务器可以处理的流量)。

在上面的代码中,没有办法在不阻塞的情况下做到这一点。

在理想的情况下,删除必须在添加到缓存之前发生,因此我可以异步关闭服务器并等待 ShutdownServer 事件...但是无法从在 write 方法中,它必须知道何时开始。换句话说,我想将 SwitchServerTraffic(from: RequestType, to: RequestType) 发送到 server,其中 from 将是被逐出的键和 to 将是添加的键。

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

有没有办法访问 Caffeine 中的候选人驱逐集?如果没有,是否有另一种方法来解决这个问题来避免它?

最佳答案

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

Map<K, V> coldest = cache.policy().eviction().get().coldest(count);

如果删除发生在逐出之前,则需要所有写入都由排他锁保护,或者可以同时评估策略。前者将成为瓶颈,后者将导致命中率显着下降(例如,通过使用随机采样)。相反,缓存使用带有中间缓冲区的记录和重播策略,这吸收了并发的大部分损失。

默认情况下,逐出是与面向用户的调用异步执行的,因此大多数对 CacheWriter#delete 的调用将被隐藏。但是,如果该调用的成本很高,那么它会延迟下一个项目的驱逐。

不幸的是,如果不站在您的立场上很难提供建议,因为您的场景对您的需求有独特的限制。您可能会发现 Cache.asMap() 中的计算方法对于最终的解决方案非常有用。

关于java - 是否有可能在 Caffeine 中获取候选被逐出 key 集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50761315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com