Redis BitMap
概述
1.BitMap简介
2.BitMap相关指令
3.BitMap使用场景
第1节 BitMap简介
BitMap,位图,是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身,value对应0或1,8个bit可以组成一个字节Byte,所以BitMap本身会极大的节省储存空间。
Redis从2.2.0版本开始增加了setbit、getbit、bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在原set命令上的扩展。
第2节 BitMap相关指令
1.setbit
语法:setbit key offset value
setbit对key所储存的字符串值,设置或清除指定偏移量上的位(bit)。位的设置或清除取决于value参数,可以是0也可以是1 。如果Redis key不存在,则自动生成一个新的字符串值。字符串会自动伸展以确保可以将value保存在指定的偏移量上。当字符串值进行伸展时,空白位置以0填充。
offset 参数必须大于等于0且小于2的32次方 (BitMap被限制在 512 MB 之内)。因为Redis字符串的大小被限制在512M以内, 如果需要使用比这更大的空间,则必须使用多个key。
通过以下两个指令分别设置offset=0和offset=100的位信息。
setbit marketing 0 1
setbit marketing 100 1
执行以上命令得到如图所示的结果。
2.getbit
语法:getbit key offset
对key所储存的字符串值,获取指定偏移量上的位(bit)。如果offset比字符串值的长度大,或者key不存在时,则返回0。
通过以下指令分别设置offset=0,offset=101,offset=50和offset=100的位信息。
getbit marketing 0
getbit marketing 101
getbit marketing 50
getbit marketing 100
执行以上命令得到如图所示的结果。
3.bitcount
语法:bitcount key [start] [end]
bitcount用于返回被字符串中设置为1的个数(是以byte字节为单位不是bit)。一般情况下,给定的整个字符串都会被进行计数,通过指定额外的start或end参数,可以让计数只在特定的位上进行。start和end参数的设置可以使用负数值。不存在的key被当成是空字符串来处理,因此对一个不存在的key进行bitcount操作,结果为 0 。
通过以下指令分别验证bitcount指令。
bitcount marketing
bitcount marketing 0 0
bitcount marketing 0 1
bitcount marketing 0 12
bitcount marketing 0 11
执行以上命令得到如图所示的结果。
4.bitpos
5.bitop
参考以下链接
http://redisdoc.com/bitmap/index.html
第3节 BitMap使用场景
BitMap适用于网站活跃活跃用户统计/用户行为统计等场景。
为了统计今日登录的用户数,使用一个BitMap,每一位标识一个用户ID。当某个用户访问我们的网页或执行了某个操作,就在bitmap中把标识此用户的位置为1。今日24点使用bitcount指令统计此BitMap中的1的数量即可计算出进入登陆人数。
用户行为统计,如统计2年内用户参与的活动次数,当超过用户参与活动超过10次后,不再让用于参与活动。则BitMap设置脚本如下所示。
setbit 18516601234 0 0
setbit 18516601234 1 0
setbit 18516601234 2 0
setbit 18516601234 3 0
setbit 18516601234 4 0
·········
setbit 18516601234 198 1
setbit 18516601234 199 0
setbit 18516601234 200 0
·········
则在活动期间校验用于能否继续参与活动,只需通过以下伪代码进行判断即可。
long total=bitcount 18516601234
if(total < 10) {
// 用户可以继续参加活动
} else {
// 用户不能继续参加活动
}