gpt4 book ai didi

java - Guava 缓存 : manual management by removal policy

转载 作者:行者123 更新时间:2023-11-30 07:10:32 24 4
gpt4 key购买 nike

我有这样的事情:

private final Cache<Long, BlockingDeque<Peer>> peers = CacheBuilder.newBuilder()
.expireAfterAccess(10, TimeUnit.MINUTES)
.build();

public class Peer {
public void hanleRequest(String request) { ... }
//....
}

Cache仅提供两个策略:expiredAfterWriteexpireAfterAccess .第一个和第二个都不适合我。

我要 BlockingDeque<Peer>实体在最后一次调用 Peer#handleRequest() 后 10 分钟后过期Peer 之一的方法属于那个的对象 BlockingDeque .表示 Peer#handleRequest()重置过期计数器。

我想要Peer的任何其他方法对象不会重置计数器。

我想要 peers.get(key) 也不重置计数器。

示例

peers.getIfPresent(key); // doesn't reset counter
peers.getIfPresent(key).add(new Peer()); // doesn't reset counter
peers.getIfPresent(key).remove(peer); //doesn't reset counter
peers.getIfPresent(key).handleRequest(request); // RESET counter!

问题

  1. 在 Guava 的帮助下这可能吗 Cache , ExpiringMap , MapMaker或任何其他 Guava map ?
  2. 如果第一个问题的答案是否定的。 我能否只自定义其中一个 Guava 元素,而不需要从头开始实现所有元素?
  3. 如果第二个问题的答案是否定的。 我自己实现它的更好方法是什么? 目前我想应该是 ConcurrentHashMap另外还有守护线程。该线程将每 5-15 秒遍历整个 map 并检查是否有任何实体已过期

更新: 这是一个好的解决方案吗?如我所料,handleRequest是对每个用户请求都会执行的操作,所以它的性能保持在第一位。约BlockingDeque peers 中的对象缓存接近 10,大约 Peer一个双端队列中的对象是 2。

private final Cache<Long, BlockingDeque<Peer>> peers = CacheBuilder.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES) //CHANGE TO WRITE POLICY
.build();

public class Peer {
public void hanleRequest(String request) {
BlockingDeque<Peer> deque = peers.getIfPresent(key);
peers.invalidate(key);
peers.put(key, deque);
//...
}
//....
}

最佳答案

首先要说一句:你问的那种问题闻起来像 XY 问题,请参阅: https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem因此,也许一些您真正想要实现的背景会很好。

从字面上看这个问题,我会做以下事情:

为“不重置计数器”访问使用没有过期的第二个缓存。将删除监听器添加到对等缓存,以从第二个缓存中删除值。也许只是一个 HashMap 也可以。资源使用实际上由对等缓存控制。

关于java - Guava 缓存 : manual management by removal policy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22154785/

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