美文网首页
并发访问计数

并发访问计数

作者: peerben | 来源:发表于2019-03-08 22:01 被阅读0次
WechatIMG3.jpeg

有人问了这么一个问题,想了一下,以下是我的实现,觉得可以满足题目要求了。
getStat就不写了,遍历即可,如有大佬看到,请不吝指教。

package com.htdadao;

import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.BiPredicate;
import java.util.function.Predicate;

interface ICounter {
  void hit();

  StatData getStat();
}

class StatData {
  public int last10SecAverage;

  public int last10MinAverage;

  public int last60MinAverage;

  public List<Integer> last60SecHistory;
}

public class VisitStatistic implements ICounter{

  private AtomicLong totalCounter = new AtomicLong(0);
  private ConcurrentHashMap<String, AtomicLong> conMap = new ConcurrentHashMap<>();

  //max range 60min
  private ConcurrentLinkedQueue<String> statQueue = new ConcurrentLinkedQueue<>();

  private static BiPredicate<String, String> exceeds60min = (pre, now) ->
    pre != null && (Integer.parseInt(now) - Integer.parseInt(pre)) / 60 > 60;


  public void hit() {
    totalCounter.incrementAndGet();

    String secTimeStamp = String.valueOf(Instant.now().getEpochSecond());

    conMap.computeIfAbsent(secTimeStamp, (k) -> {

      statQueue.add(k);

      // exceeds 60 min, clean up
      String h = statQueue.peek();
      while (exceeds60min.test(h, k)){
        statQueue.remove(h);
        conMap.remove(h);
        h = statQueue.peek();
      }

      return new AtomicLong(0);
    });

    conMap.computeIfPresent(secTimeStamp, (k, v) -> {
      v.incrementAndGet();
      return v;
    });

  }

  public StatData getStat() {

  }
}

相关文章

  • 并发访问计数

    有人问了这么一个问题,想了一下,以下是我的实现,觉得可以满足题目要求了。getStat就不写了,遍历即可,如有大佬...

  • Nginx Tomcat集群配置

    并发访问 对于服务器来说,大量的并发访问容易造成服务器宕机 并发访问性能测试 可以通过压力测试来检查高并发访问的性...

  • Java并发核心

    Semaphore Semaphore是一个计数信号量,常用于限制客访问某些资源的线程数目,相当于一种用来控制并发...

  • redis并发控制

    Redis应对并发问题 并发访问 redis的并发访问,是指多个客户端,对同一份数据进行修改。并发访问控制对应的操...

  • dispatch_semaphore(信号量)介绍及在知名库中的

    信号量 信号量是基于计数器的一种多线程同步机制,用来管理对资源的并发访问。 信号量就是一种可用来控制访问资源的数量...

  • JUC--并发工具类:Semaphore

    2018-10-02 原文推荐 死磕Java并发 信号量Semaphore是一个控制访问多个共享资源的计数器,和C...

  • java信号量Semaphore与计数AtomicLong限流

    下面是使用信号量限制并发访问的一个简单例子 这里我们创建了 100 个线程同时执行,但是由于信号量计数为 10,所...

  • face 29高并发大流量

    高并发大流量 并发 并发访问,在某个时间点 有多少个访问同时到来 php如何处理网站大流量高并发问题 流量优化 防...

  • 2018-09-15(JDK并发工具类_CountDownLat

    CountDownLatch 程序计数器. 代码如下: 理解:这是一个计数器,控制多线程并发的.

  • 子域名访问计数

    一个网站域名,如"discuss.leetcode.com",包含了多个子域名。作为顶级域名,常用的有"com",...

网友评论

      本文标题:并发访问计数

      本文链接:https://www.haomeiwen.com/subject/sagdpqtx.html