前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BitMap算法和Java的实现类BigSet

BitMap算法和Java的实现类BigSet

作者头像
源哥
发布2019-03-29 16:12:43
1.1K0
发布2019-03-29 16:12:43
举报
文章被收录于专栏:源哥的专栏源哥的专栏

考虑下面几个应用场景:

  1. 统计每天的日活(访问量、用户数等)
  2. 统计某个部门的联系客户量
  3. 对大量数据进行排序

针对第一种应用场景,通常的做法就是采用明细表来记录每一个访问量,然后统计每天的用户数(用一个用户,多次访问,只算一个)。

这里有个问题,就是假设用户量比较大,假设一天有1000万的请求量,一个月就有3亿的数据量,对数据库的压力比较大。

这是我们就可以考虑采用BigMap来实现,它之间用位置代替数字,用0和1来表示这个数字是否存在,可以加大的压缩存储空间。比如说,1亿个用户一天的数据量也就 1 0000 0000bit = 11.92m,也就是说用户一天的登录信息也就产生11.92m的数据量。一个月也就357.63m的数据量。

Java的实现就是BigSet,下面是一段实现代码:

BitSet bm = new BitSet();

System.out.println(bm.isEmpty()+"--"+bm.size());

bm.set(0);

System.out.println(bm.isEmpty()+"--"+bm.size());

bm.set(1);

System.out.println(bm.isEmpty()+"--"+bm.size());

System.out.println(bm.get(65));

System.out.println(bm.isEmpty()+"--"+bm.size());

bm.set(65);

System.out.println(bm.isEmpty()+"--"+bm.size());

上面的逻辑很好理解,存储的数据越大,BitSet就会自动扩展64位来存储,所以当数据量不多的时候,占用的存储也不多。

正常影响,一个int数据是32位,而BitSet则可以存储32个数字和0/1标志位。所以正常情况下,存储空间只需要原先1/32甚至更小。

但这种实现也有一个缺点,就是数据过于稀疏的情况下,会产生大量无效遍历,导致低效。

另外,BitSet只能存储int数据,当数据量超过int范围的时候,BitSet就不够存放了,这个时候该怎么办呢?

一种思路就是拆分多个BitSet来存放数据,比如说,现在最大的用户编号已经达到int的1.5倍,那么我们用2个BitSet来存放。

针对第二种场景,通常的做法是直接从明细表统计,当时当数据量比较大的时候,压力就上来了。如果是要求实时统计,则压力更大。

采用BigSet可以解决这个问题,把没有员工的访问数据保存到BigSet中,然后一个部门,则通过部门内的员工的BigSet进行与或操作,通过实行多个员工的统计。

针对第三个产品,往往使用sql语句,采用order by对数据进行排序,但这种方法在遇到大量数据的时候性能很差。

采用BigSet存储数据,那么数据天生就是排序的,可以顺序获取。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档