需求描述:有一个接口,接收参数用户ID。现在要统计访问该接口的所有用户各自的请求数。接口定义如下
public void req(String uid) {}
![5161ceb7254cedb13369cbc191a65cb7.gif](https://i-blog.csdnimg.cn/blog_migrate/4cb601db32974550675a89568a7fe820.gif)
在分析这个需求之前,我们先来看两个比这个简单的需求
1、统计该接口总的请求数
2、统计访问该接口的所有用户集合
第一个需求我们可以用AtomicInteger解决累加的问题,第二个需求我们可以用ConcurrentHashSet解决并发add的问题。
我们真正的需求是这两个简单需求的合并,所以我们理所当然的确定使用ConcurrentHashMap。
但是有个问题,如何初始化AtomicInteger?
ConcurrentHashMap 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(); } } }
![5161ceb7254cedb13369cbc191a65cb7.gif](https://i-blog.csdnimg.cn/blog_migrate/4cb601db32974550675a89568a7fe820.gif)
我们通过putIfAbsent解决初始化的问题。这个办法会生成一定数量的无用对象(AtomicInteger),但按照正常来说,单用户的同时请求量并不大