- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用缓存来根据请求类型维护可路由服务器的列表。
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/
我们配置了为 1200(20 分钟),但缓存在缓存创建时间一分钟后自动被逐出。 有人可以告诉我如何使缓存在指定的时间段内有效吗? 最佳答案 下面 hazelcast.xml 中的代码片段将“simpl
dot net 的 MemoryCache 驱逐发生在什么时候?如何在控制台应用程序中模拟驱逐?每当我尝试将对象添加到内存缓存直到发生逐出时,我都会得到 OutofMemoryException。 最
这是我的守护进程 apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx spec: selector: matchLabe
我收到以下异常: java.lang.IllegalStateException: Session/EntityManager is closed at org.hibernate.inter
我正在使用 Google Guava CacheBuilder创建一个 Cache实例。我的代码如下所示: return CacheBuilder.newBuilder() .
我是一名优秀的程序员,十分优秀!