“ 点击关注Coding小暮,获取更多优质内容哦”
redis节衣缩食-BitMaps位图
使用场景
数据量庞大,且数据内容单一。
在我们平时开发中,会有以下场景:
- 上亿用户的某一状态,将每一个用户的id对应BitMaps的一个下标,就可以获取对应的状态,比如说发邮件,记录用户签到数据等...
- 统计某一资源每日访问量,可以每天定时生成一个BitMaps,当用户访问了这个资源的时候,可以在BitMaps中把这个用户的位置下标设置为1
BitMaps原理
BitMaps事实上就是一个字符串,它实现了对字符串的位操作,也就是byte数组(如下图)。
数组中的每个单元只能存储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代码
老夫准备了一下java学习资料,就在我的公众号里
。少侠可以关注我的公众号在底部点击学习资料便可以免费获取了。祝少侠早日练就一身本领,行侠仗义、前程似锦。