本文主要是介绍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的介绍与使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!