当前位置: 首页 > 知识库问答 >
问题:

如何从Guava LoadingCache中可靠地删除记录?

谭山
2023-03-14
public class MetricHolder {
  private final ExecutorService executor = Executors.newFixedThreadPool(2);
  private final LoadingCache<String, AtomicLongMap<String>> clientIdMetricCounterCache =
      CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES)
          .removalListener(RemovalListeners.asynchronous(new SendToDatabase(), executor))
          .build(new CacheLoader<String, AtomicLongMap<String>>() {
            @Override
            public AtomicLongMap<String> load(String key) throws Exception {
              return AtomicLongMap.create();
            }
          });

  private static class Holder {
    private static final MetricHolder INSTANCE = new MetricHolder();
  }

  public static MetricHolder getInstance() {
    return Holder.INSTANCE;
  }

  private MetricHolder() {}

  public void increment(String clientId, String name) throws ExecutionException {
    clientIdMetricCounterCache.get(clientId).incrementAndGet(name);
  }

  public LoadingCache<String, AtomicLongMap<String>> getClientIdMetricCounterCache() {
    return clientIdMetricCounterCache;
  }

  private static class SendToDatabase implements RemovalListener<String, AtomicLongMap<String>> {
    @Override
    public void onRemoval(RemovalNotification<String, AtomicLongMap<String>> notification) {
      String key = notification.getKey();
      AtomicLongMap<String> value = notification.getValue();
      System.out.println(key);
      System.out.println(value);
      // sending these key/value to some other system

    }
  }
}

那么expireafterwrite是如何工作的呢?它是否像调度程序一样工作,它每1分钟运行一次,删除ClientidMetricCounterCache中的所有条目,然后在1分钟后再次醒来,从同一个缓存中删除所有条目,并继续这样运行?看了维基之后,我怀疑它是那样工作的。如果没有,那么我如何能够可靠地每1分钟删除这些记录并发送到其他系统,因为我的写入可能在一段时间内很少?

看来我可能必须使用Guava TimeLimiter接口和SimpleTimeLimiterScheduledExecutorService来可靠地超时调用,然后删除条目?如果是,谁能提供一个例子,这将如何工作在我目前的例子?

共有1个答案

元修然
2023-03-14

对我来说,你似乎在滥用缓存,而地图可以做到这一点。您没有使用过期,没有大小限制,没有缓存,您只是收集统计数据。

您使用的唯一特性是加载方面,这并不值得。

我建议使用AtomicReference > :

    null

它会比原来的方法产生更多的垃圾,但是所有的垃圾都是短暂的,所以您实际上可能会让GC更开心。

它很简单,不需要对库或其实现细节有很深的了解。

我想,volatile代替atomicreference也可以。

 类似资料:
  • 我正在谷歌地图上工作,我试图添加标记到谷歌地图,然后试图删除它,但现在我已经完成了添加和删除下面的代码 但是现在有一个问题,我应该如何设置标记的值。推(标记),因为我删除了一个标记,所以它的值必须小于预期存储的值。。有人能帮忙吗

  • 我正在创建一个脚本,用于将一个参数传入MySQL查询,然后执行该MySQL查询以从多个表中删除多条记录。 现在我遇到了一个问题,我需要为每个单独的表创建多个文件。是否有一种方法可以在一个文件中执行每个MySQL查询,而不是为每个查询创建多个文件? 以下是我创建的代码:

  • 有人有更好的主意吗?

  • 本文向大家介绍从表中删除记录,其中相关面试题,主要包含被问及从表中删除记录,其中时的应答技巧和注意事项,需要的朋友参考一下 尝试首先选择最大组,然后将其用作子查询。 编辑:

  • 问题内容: 我正在使用php,mysql和ajax从表中删除记录。问题是,在MySQL_query中,它没有获取显示为“ id = undefined”的ID,我试图将ID传递给查询,但我不知道我哪里出了错,我试图打印MySQL的节目 谁能告诉我如何通过身份证…谢谢 我的阿贾克斯 我的HTML delete.php 问题答案: 您ID的索引是1,即第二个索引。不是2。