Redis的BitMap使用注意事项

redis的bitmap存储结构

redis中存储bitmap使用的是字符串类型存储,也就是在redis内部都是通过SimpleDynamicString 简单动态字符串格式存储的bitmap,内容如下:
在这里插入图片描述
这个结构和正常的字符串的存储结构一模一样,注意是一模一样,也就是意味着redis内部在执行setBit、getBit、bitCount这些操作的时候并不区分是真正的字符串还是bitmap,因为对于redis底层来说两者都是字符串存储格式,redis内部没有对两者做区分。

redis bitmap操作命令

设置命令:

除了可以直接通过setbit命令对某个key的offset直接置位之外,我们也可以直接先手动构造一个设置好了位操作的byte[]字符串的数组,然后通过set key byte[]的方式对key进行置位,我们说过redis内部并不区分bitmap和真正的字符串类型

获取命令:

除了可以直接通过getbit命令对某个key的offset直接获取值外,我们也可以通过get key 获取到字符串byte[]数组,然后我们在对byte[]数组进行位解析,这样也可以得到全量的每个偏移的位的具体值了,其原因还是我们说过的redis内部并不区分bitmap和真正的字符串类型

运算命令:

bitop or destkey srckey1 srckey2 srckey3 类似对三个bitmap的key进行或操作后把结果放到了destkey中了,一次与/或/异或操作可以操作多个srckey,这些srckey可以是真正的bitmap对象也可以是字符串,redis不区分,但是不能在一个操作中同时进行与和或,或者 与和异或的操作.

BitMap使用注意事项

setbit key offset 1 设置某个offset的位为0或者1时,offset之前的所有byte[]的内存都要被占用,也就是说比如offset=100000,那么对于redis来说他至少需要申请100000/8=12500长度的byte[]数组才行,相当于只有byte[12500]这个字节真正使用到了,前面的byte[0-12499]都没有真正用到,这些内存就白白浪费掉了,所以使用redis的bitmap一定要注意尽量从小整数的序号开始往上加,否则bitmap结构带来的不是redis内存的节省,而是redis内存的爆炸溢出.

BitMap的最大长度

redis的bitmap能支持的最大offset是2的32次方,也就是42亿,原因是redis的字符串最大只能是512M字节,所以512 * 1024 * 1024 * 8 = 2的32次方.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RedisBitmap 类型是一种特殊的字符串类型,它可以用来处理一些基于二进制位的数据结构,例如布隆过滤器(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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值