需求描述:有一个接口,接收参数用户ID。现在要统计访问该接口的所有用户各自的请求数。接口定义如下
public void req(String uid) {}
在分析这个需求之前,我们先来看两个比这个简单的需求
1、统计该接口总的请求数
2、统计访问该接口的所有用户集合
第一个需求我们可以用AtomicInteger解决累加的问题,第二个需求我们可以用ConcurrentHashSet解决并发add的问题。
我们真正的需求是这两个简单需求的合并,所以我们理所当然的确定使用ConcurrentHashMap<String, AtomicInteger>。
但是有个问题,如何初始化AtomicInteger?
ConcurrentHashMap<String, AtomicInteger> hashMap = new ConcurrentHashMap<>();
@GetMapping("/test")
public void req(String uid) {
if(hashMap.containsKey(uid)) {
hashMap.get(uid).incrementAndGet();
} else {
AtomicInteger atomicInteger = hashMap.putIfAbsent(uid, new AtomicInteger(1));
if(atomicInteger!=null) {
atomicInteger.incrementAndGet();
}
}
}
我们通过putIfAbsent解决初始化的问题。这个办法会生成一定数量的无用对象(AtomicInteger),但按照正常来说,单用户的同事请求量并不大