BloomFilter和BitMap的介绍与使用

一、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
  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Redis 的 Bitmap 类型是一种特殊的字符串类型,它可以用来处理一些基于二进制位的数据结构,例如布隆过滤器(Bloom Filter)或者统计用户在线时长等。 Bitmap 类型支持的操作包括: - bitset key offset value:将指定偏移量上的二进制位设置为 1 或 0。 - bitget key offset:获取指定偏移量上的二进制位的值。 - bitcount key [start end]:计算指定范围内的二进制位被设置为 1 的个数。 - bitop operation destkey key [key ...]:对多个 Bitmap 进行按位操作,并将结果保存到目标 Bitmap 中。 - bitpos key bit [start] [end]:在指定范围内查找第一个被设置为指定值的二进制位的位置。 以下是一个示例,演示如何使用 Bitmap 类型来统计用户在线时长: ``` # 将用户的登录时间记录到 Bitmap 中 # 假设用户 ID 为 1001,登录时间为 2021-10-01 10:00:00,登录时长为 30 分钟 # 将 2021-10-01 10:00:00 转换为时间戳,并除以 300,得到登录时间所在的 5 分钟时间段 redis> setbit online:1001 200 1 # 查询用户在线时长 # 统计 2021-10-01 10:00:00 ~ 2021-10-01 10:30:00 时间段内,用户在线的 5 分钟时间段个数 redis> bitcount online:1001 0 -1 6 ``` 在上面的示例中,我们将用户的登录时间记录到 online:1001 这个 Bitmap 中,偏移量为 200 的二进制位被设置为 1。接着,我们使用 bitcount 命令来统计该 Bitmap 中被设置为 1 的二进制位数量,即用户在线的时间段个数。由于每个时间段为 5 分钟,因此在线时长为 30 分钟,对应的时间段个数为 6。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Forlan

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值