BloomFilter和BitMap的介绍与使用

2024-01-11 00:52

本文主要是介绍BloomFilter和BitMap的介绍与使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、BloomFilter
    • 1、是什么?
    • 2、BloomFilter的使用
  • 二、Bitmap
    • 1、是什么?
    • 2、Bitmap的使用
  • 三、总结
    • 1、区别
    • 2、遇到问题:OOM command not allowed when used memory > 'maxmemory'.

一、BloomFilter

1、是什么?

BloomFilter是一种概率型数据结构,用于判断一个元素是否存在于集合中。它通过使用多个哈希函数和位数组来实现。当一个元素被添加到BloomFilter中时,它会被哈希成多个不同的位置,并将这些位置对应的位数组置为1。

当需要判断一个元素是否存在于BloomFilter中时,它会被哈希成相同的位置,并检查这些位置对应的位数组是否都为1。如果有任何一个位置的位数组为0,则可以确定该元素一定不存在于集合中;如果所有位置的位数组都为1,则该元素可能存在于集合中,但也可能是误判。因此,BloomFilter具有一定的误判率,但它的优点是占用空间小且查询速度快。

总的来说,特点就是在的不一定在,不在的一定不在。

2、BloomFilter的使用

将Guava库添加到您的项目依赖中

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.1-jre</version>
</dependency>

创建一个Bloom Filter对象,指定预期元素数量和期望的误报率。

BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), expectedInsertions, falsePositiveRate);

expectedInsertions是预期元素数量,falsePositiveRate是期望的误报率。

使用put方法将元素添加到Bloom Filter中:

bloomFilter.put(element);

使用mightContain方法来检查一个元素是否可能存在于Bloom Filter中:

boolean isPresent = bloomFilter.mightContain(element);

如果返回true,则表示元素可能存在于Bloom Filter中;如果返回false,则表示元素一定不存在于Bloom Filter中。

Bloom Filter是一个概率性数据结构,它可以快速判断一个元素可能存在于集合中,但有一定的误报率。因此,它适用于那些可以容忍一定误报率的场景,例如缓存、大规模数据过滤等。

二、Bitmap

1、是什么?

Redis的Bitmap是一种位图数据结构,用于存储和操作位级别的数据。它可以表示一组二进制位,并提供了一些位操作的功能,如设置位、清除位、计数位等。

在Redis中,位图可以使用字符串类型来表示,每个字符可以存储8个位。通过使用位操作命令,可以对位图进行各种操作,如设置某个位的值、获取某个位的值、统计位图中值为1的位的数量等。

位图在实际应用中有很多用途,例如记录用户的在线状态、统计用户的活跃度、进行布隆过滤器等。由于位图的存储方式非常紧凑,可以节省存储空间,并且位操作命令的执行速度非常快,因此在某些场景下,位图是一种非常高效的数据结构。

2、Bitmap的使用

将Jedis库添加到您的项目依赖中

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>

创建一个Jedis对象,用于与Redis建立连接:

Jedis jedis = new Jedis("localhost", 6379);

使用setbit命令将位图中的某个位设置为指定的值(0或1):

jedis.setbit("bitmap-key", offset, value);

bitmap-key是位图的键名,offset是要设置的位的偏移量,value是要设置的值(0或1)。

使用getbit命令获取位图中指定位的值:

boolean bitValue = jedis.getbit("bitmap-key", offset);

bitmap-key是位图的键名,offset是要获取的位的偏移量。bitValue将返回位的值(0或1)。

位图的偏移量从0开始,可以表示非常大的位集合。您可以使用bitcount命令计算位图中设置为1的位的数量。

三、总结

1、区别

BloomFilter和Redis的Bitmap是两种不同的数据结构,用于不同的目的。

  • BloomFilter是一种概率型数据结构,用于判断一个元素是否存在于集合中。它通过使用多个哈希函数和位数组来实现。BloomFilter可以用于快速判断一个元素是否可能存在于集合中,但有一定的误判率。

  • Redis的Bitmap是一种位图数据结构,用于存储和操作位级别的数据。它可以表示一组二进制位,并提供了一些位操作的功能,如设置位、清除位、计数位等。Redis的Bitmap可以用于记录用户的在线状态、统计用户的活跃度等。

总结来说,BloomFilter主要用于判断元素的存在性,而Redis的Bitmap主要用于位级别的数据操作。它们在功能和应用场景上有所不同。

2、遇到问题:OOM command not allowed when used memory > ‘maxmemory’.

redis内存不够了,超过了最大内存

查看内存大小,单位为b,转为M的话,可以除以1024*1024

CONFIG GET maxmemory

设置内存大小

 CONFIG SET maxmemory xxx

这篇关于BloomFilter和BitMap的介绍与使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592632

相关文章

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件