天天看点

redis获取byte数组_redis节衣缩食BitMaps位图redis节衣缩食-BitMaps位图

“ 点击关注Coding小暮,获取更多优质内容哦”

redis节衣缩食-BitMaps位图

使用场景

数据量庞大,且数据内容单一。

在我们平时开发中,会有以下场景:

  1. 上亿用户的某一状态,将每一个用户的id对应BitMaps的一个下标,就可以获取对应的状态,比如说发邮件,记录用户签到数据等...
  2. 统计某一资源每日访问量,可以每天定时生成一个BitMaps,当用户访问了这个资源的时候,可以在BitMaps中把这个用户的位置下标设置为1

BitMaps原理

BitMaps事实上就是一个字符串,它实现了对字符串的位操作,也就是byte数组(如下图)。

redis获取byte数组_redis节衣缩食BitMaps位图redis节衣缩食-BitMaps位图

数组中的每个单元只能存储0或者1,所以非常适合存储Boolean值。数组的下标在BitMaps中叫偏移量。

我们可以使用getbit/setbit等将byte数组看成“位数组”来处理。可以使用BitMaps的命令直接去操作一个类型为String 的key。

redis中单个String最大长度是512M,这个长度限制也同样适用于BitMaps,理论上这个长度可以存储40亿用户数据。

常用方法

写入

setbit key offset value

setbit命令接收两个参数,

• 第一个参数表示你要操作的是第几个bit位,第二个参数表示你要将这个位设为何值,可选值只有0,1两个。

• 如果所操作的bit位超过了当前字串的长度,reids会自动增大字串长度。

读写

getbit key offset

getbit只是返回特定bit位的值。如果试图获取的bit位在当前字串长度范围外,该命令返回0。

统计和查找

bitcount key [start] [end]

获取Bitmaps指定范围值为1的个数,可以用来统计用户在一段时间内签到的天数。

bitpos key val  [start] [end]

返回字符串里面第一个被设置为1或者0的bit位。val的值只能是1或者0。[start] [end]是指定了一个范围,例如

start=0

 并且 

end=2

是指前三个字节范围内查找

注意bitcount和bitpos时间复杂度是:O(N)

java代码

redis获取byte数组_redis节衣缩食BitMaps位图redis节衣缩食-BitMaps位图

      老夫准备了一下java学习资料,就在我的公众号里

redis获取byte数组_redis节衣缩食BitMaps位图redis节衣缩食-BitMaps位图

。少侠可以关注我的公众号在底部点击学习资料便可以免费获取了。祝少侠早日练就一身本领,行侠仗义、前程似锦。

redis获取byte数组_redis节衣缩食BitMaps位图redis节衣缩食-BitMaps位图
redis获取byte数组_redis节衣缩食BitMaps位图redis节衣缩食-BitMaps位图