用bitSet做百万级ip去重

如果直接将几百万数据仍到bitset,内存是否够用?实际测试,600万ip放到一个bitSet中,jvm内存会爆。

所以,就简单做了下分组,构建一个HashMap<String, BitSet>,

以192.168.6.2为例,将192.168直接截取为字符串,当作hashmap的key,后2位补零为006002,将006002放入“192.168”分组的bitSet中。

适用场景:

这种构建bitSet的去重方式,适合判断某个ip是否在百万级的ip集合中。

 不适用输入一个百万级ip集合,去重后输出这个结果集。

代码如下:

import java.util.BitSet;
import java.util.HashMap;

public class DistcIp {

public static void main(String[] args) {
  HashMap<String, BitSet> groupBitSet=new HashMap<String, BitSet>();
  //先遍历ip,
  String ip1="192.168.0.3";
  String ip2="192.168.0.4";
  String ip3="192.162.0.6";
  String ip4="192.162.0.6";
  String ip5="192.157.0.4";

  String[] strs=new String[] {ip1,ip2,ip3,ip4,ip5};

  for (String cip : strs) {
  String group=getBitSetGroup4IP(cip);
  int value=getBitSetValue4IP(cip);
  if(groupBitSet.containsKey(group)) {
    groupBitSet.get(group).set(value);
  }else {
    BitSet bs= new BitSet();
    bs.set(value);
    groupBitSet.put(group, bs);
  }
 }

  String group2=getBitSetGroup4IP(ip1);
  int value2=getBitSetValue4IP(ip1);
  BitSet bs=groupBitSet.get(group2);
  System.out.println(bs.get(value2));

  String group3=getBitSetGroup4IP("192.168.0.1");
  int value3=getBitSetValue4IP("192.168.0.1");
  BitSet b3=groupBitSet.get(group3);
  System.out.println(b3.get(value3));

}

  /**
  * 用来构建BitSet数值;
  * @param ip
  * @return int
  */
  static int getBitSetValue4IP(String ip){
    String[] ips=ip.split("\\.");
    if(ips.length!=4) return 0;
    String tmp=formatVal(ips[2])+formatVal(ips[3]);
    return Integer.valueOf(tmp);
  }

  /**
  * 用来构建BitSet分组;
  * @param ip
  * @return String
  */
  String getBitSetGroup4IP(String ip){
    String[] ips=ip.split("\\.");
    if(ips.length!=4) return null;
    return ips[0]+"."+ips[1];
  }

  //这个是用来补零的,如:125.42.1.8 ->125.042.001.008
  static String formatVal(String s) {
    String res="";
    char[] ca=s.toCharArray();
    for(int i=ca.length;i<3;i++) {
      res+="0";
    }
    return res+s;
  }

}

原文地址:https://www.cnblogs.com/yanghaolie/p/9240334.html

时间: 2024-11-10 03:45:54

用bitSet做百万级ip去重的相关文章

国内最大的动态IP代理服务商,百万级动态IP无限换是哪家最好?

兔子动态IP-国内最大的动态IP代理服务商,百万级动态IP无限换. 兔子IP ,动态IP行业领导者.兔子IP是个专业的全局IP代理服务平台,内含上千的专业级动态ip方案,且支持一键轻松换IP,提供专业.高质量且稳定的代理服务. 软件名称:兔子动态IP软件版本:V1.0.1软件大小:1.46MB 软件语言:简体中文/繁体中文/英文 软件类型:国产软件 运行环境:Winxp/vista/win7/win8/win10/苹果/安卓插件情况:无插件 软件介绍:兔子动态IP是国内IP代理软件中一款强大的游

如何实现百万级的语音聊天室

上篇我们介绍了如何从零开始搭建一套语音聊天室后台,设计方案比较基础,本篇我们将介绍语音聊天室的升级版本——在海量用户同时在线的情况下,语音服务器的架构将如何升级改造. 互联网产品后台开发信奉一句话:先扛住再优化.工程师当然是希望把系统设计得尽善尽美,但是业务发展往往是不允许的,因此后台工程师的工作就是在技术和业务之间寻找平衡点.大部分的系统都是逐步迭代演进而来的,没有一蹴而就的完美系统. 前文中,我们介绍了语音服务器分SET部署的概念.其实一直在回避一个问题,分SET的缺点是什么? 分SET限制

高防CDN防御百万级DDoS攻击

企业了解DDoS的攻击方式,他们就必须决定如何应付这种攻击,这是现在几乎不可避免的状况.第一个方法是与一些DDoS防御供应商合作,如集群盾.WAFCDN.高防盾.高防云盾等,这是应对最严重攻击的一个可行方法.这些公司专门研究如何防御和应付可能的恶意流量.然而,如果一个组织没有足够资源购买第三方产品和服务,那么聪明的安全管理员也会采取下面这些步骤,尽量减小DDoS攻击的危害.      首先,安全管理员应该先了解他们组织的互联网连接.正如前提所提到的,一般组织的平均连接带宽为10Gbps,所以管理

【netty】Netty系列之Netty百万级推送服务设计要点

1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发推送服务遇到的各种技术问题. 由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路. 1.2. 推送服务

如何生成每秒百万级别的 HTTP 请求?

本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇.它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间. 负载生成器是一些生成用于测试的流量的程序.它们可以向你展示服务器在高负载的情况下的性能,以及让你能够找出服务器可能存在的问题.通过负载测试了解服务器的缺点,是测试服务器弹性以及未雨绸缪的好方法. 负载生成工具(Load-Generating Tools) 在进行负责测试时要牢记一件重要的事:你能在 Linux 上建立多少个

Netty系列之Netty百万级推送服务设计要点

原文:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points 1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发

单台服务器并发百万级配置(转)

单台服务器并发百万级配置(转) 目的:让服务器支持大量并发访问. 注:以下内容 ASP/ASP.NET IIS 用不成.另外要精通Linux,TCP/IP. 摘要:本文主要介绍利用单台PC服务器来实现可支持百万级用户并发访问的WEB服务器的实践工作.意在提出一些手段来发掘设备的潜力,充分利用设备资源,以求达到降低硬件投入成本和维护成本的目的. 随着硬件技术的飞速发展,当前单台PC 服务器的性能得到了显著提升,反之,硬件成本却在快速下降.另一方面,多数门户网站.大型社区在建设WEB服务.邮件服务等

每秒处理3百万请求的Web集群搭建-如何生成每秒百万级别的 HTTP 请求?

本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇.它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间. 负载生成器是一些生成用于测试的流量的程序.它们可以向你展示服务器在高负载的情况下的性能,以及让你能够找出服务器可能存在的问题.通过负载测试了解服务器的缺点,是测试服务器弹性以及未雨绸缪的好方法. 负载生成工具(Load-Generating Tools) 在进行负责测试时要牢记一件重要的事:你能在 Linux 上建立多少个

Netty系列之Netty百万级推送服务设计要点(转)

1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类: Netty是否可以做推送服务器? 如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端? 使用Netty开发推送服务遇到的各种技术问题. 由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路. 1.2. 推送服务