IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 十亿数据量 判断元素是否存在 -> 正文阅读

[大数据]十亿数据量 判断元素是否存在

核心是采用:bitMap

假设一个场景,要存0-7之内的数字[3,5,6,1,2],尽量的节省空间。


传统思路就是单纯使用集合存储:

使用redis的set集合存储,但若是数据量放大到十亿级别,集合的所占用的内存会很是大。并且,redis单个实例最大为2.5亿。

另外一种思路是使用BitMap:

表示[3,5,7,1,2],咱们能够用8bit的空间来存储,每一个数字都在对应的位置中以1的方式表示

位置7位置 6位置 5位置 4位置 3位置 2位置 1位置 0
10101110

这样,相当于每一位只存储了一个字符,只需要知道该下标是否为1,即可。

这里是不是就会发现,存储的数据必须为正整数,才可以使用bitMap进行存储。

所以我们需要做的就是,把数据转换成:正整数。

我们采用google开源的cityhash算法,先将string转换为32位整数,然后构建512MB的bitmap存储这些整数。

为什么是32位呢,因为redis实现了bitMap算法,可以从用redis的setBit进行数据存储。但是因为redis官方规定:setting bit number 2^32 -1;也就是说,存储的正整数必须小于32位。

有一个很好的工具类hutool,实现了cityhash算法,直接引用:

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.2</version>
        </dependency>
        String code="237021200005599";
        byte[] codebyte = code.getBytes();
        int codeInt = HashUtil.cityHash32(codebyte);
        System.out.println(codeInt);

?但是由于,HashUtil.cityHash32返回的是int,是一个整数,redis的bitMap仅支持正整数,存在差异性,所以我不会了。最好存进去的数就是一个32位正整数。

还有一个办法就是下面这个:不要使用redis的bitMap

RoaringBitmap 和 Roaring64Bitmap

32位以下数据直接使用?RoaringBitmap;(包含负数)

64位以下数据直接使用?Roaring64Bitmap;(包含负数)

使用hutool工具,转换成64位的整数,Roaring64Bitmap直接支持Long类型。

        <dependency>
            <groupId>org.roaringbitmap</groupId>
            <artifactId>RoaringBitmap</artifactId>
            <version>0.9.0</version>
        </dependency>
        //将字符串转换成64位bit
        String code="ddadsadsa";
        byte[] codebyte = code.getBytes();
        Long codeInt = HashUtil.cityHash64(codebyte);

        //将Long插入到bitMap中
        Roaring64Bitmap rr = Roaring64Bitmap.bitmapOf();
        rr.add(codeInt);

        long l = -4543844943551498834L;

        //判断是否存在
        System.out.println(rr.contains(l));

参考文章:BitMap与RoaringBitmap、JavaEWAH - JavaShuo

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:40:05  更:2022-06-14 22:41:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:28:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码