当前位置:   article > 正文

BloomFilter和BitMap的介绍与使用_bitmap bloomfilter

bitmap bloomfilter

一、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>
  • 1
  • 2
  • 3
  • 4
  • 5

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

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

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

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

bloomFilter.put(element);
  • 1

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

boolean isPresent = bloomFilter.mightContain(element);
  • 1

如果返回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>
  • 1
  • 2
  • 3
  • 4

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

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

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

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

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

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

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

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
  • 1

设置内存大小

 CONFIG SET maxmemory xxx
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/859300
推荐阅读
相关标签
  

闽ICP备14008679号