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
接口和SimpleTimeLimiter
或ScheduledExecutorService
来可靠地超时调用,然后删除条目?如果是,谁能提供一个例子,这将如何工作在我目前的例子?
对我来说,你似乎在滥用缓存,而地图可以做到这一点。您没有使用过期,没有大小限制,没有缓存,您只是收集统计数据。
您使用的唯一特性是加载方面,这并不值得。
我建议使用AtomicReference
:
它会比原来的方法产生更多的垃圾,但是所有的垃圾都是短暂的,所以您实际上可能会让GC更开心。
它很简单,不需要对库或其实现细节有很深的了解。
我想,volatile
代替atomicreference
也可以。
我正在谷歌地图上工作,我试图添加标记到谷歌地图,然后试图删除它,但现在我已经完成了添加和删除下面的代码 但是现在有一个问题,我应该如何设置标记的值。推(标记),因为我删除了一个标记,所以它的值必须小于预期存储的值。。有人能帮忙吗
我正在创建一个脚本,用于将一个参数传入MySQL查询,然后执行该MySQL查询以从多个表中删除多条记录。 现在我遇到了一个问题,我需要为每个单独的表创建多个文件。是否有一种方法可以在一个文件中执行每个MySQL查询,而不是为每个查询创建多个文件? 以下是我创建的代码:
有人有更好的主意吗?
本文向大家介绍从表中删除记录,其中相关面试题,主要包含被问及从表中删除记录,其中时的应答技巧和注意事项,需要的朋友参考一下 尝试首先选择最大组,然后将其用作子查询。 编辑:
问题内容: 我正在使用php,mysql和ajax从表中删除记录。问题是,在MySQL_query中,它没有获取显示为“ id = undefined”的ID,我试图将ID传递给查询,但我不知道我哪里出了错,我试图打印MySQL的节目 谁能告诉我如何通过身份证…谢谢 我的阿贾克斯 我的HTML delete.php 问题答案: 您ID的索引是1,即第二个索引。不是2。