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.guavagroupId>
  <artifactId>guavaartifactId>
  <version>30.1-jreversion>
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.clientsgroupId>
    <artifactId>jedisartifactId>
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

你可能感兴趣的:(数据结构与算法,框架,哈希算法,算法)