redis操作位图
简介:
操作位图,就是操作二进制文件,类似于java中的位运算,这样做的好处,一个是效率高,另一个是节约空间,相比于字符串,效果是很明显的。
说一个的案例,一个用户一年的签到记录,如果用Sring类型存储,那么就需要365个key/value。那如果使用位图的话,假设网站上线第一天,这个人签到了就存1,没签到就存0,那么就是1101010101。。。。。
每天的的记录占一个位,365天就是365个位,也就是46个字节,这样有效的节省了存储空间,如果要统计用户签到的天数,只需要统计1的个数。
位图的操作,可以直接操作对应的字符串(get/set),或者直接操作位(getbit/setbit)
基本操作:
1.零存整取:操作的时候用位操作,获取的时候获取字符串
例如存一个java
字符 | ASCII | 二进制 |
j | 74 | 01001010 |
a | 77 | 01100001 |
v | 118 | 01110110 |
接下来去存储
存java:默认是0,所以只存1
setbit name 1 1
setbit name 4 1
setbit name 6 1
setbit name 9 1
setbit name 10 1
setbit name 15 1
setbit name 17 1
setbit name 18 1
setbit name 19 1
setbit name 21 1
setbit name 22 1
setbit name 25 1
setbit name 26 1
setbit name 31 1
取java:
get name
2.整存零取:操作的时候用字符串操作,获取的时候用位获取
存字符串:
set k1 java
取:
3.零存零取
统计:
1的个数表示签到的天数,0表示没有签到
用bitcount key命令
bitpos也是统计,不过是范围统计,比在指定范围内出现的第一个零或者一。如统计这个用户在某个时间段的签到次数
bit的批处理
在redis新加的功能,bitfiled命令
例如:bitfiled name get u4 0:表示获取name中的位,从零开始,获取4个位,返回一个无符号数字。
bitfiled name get i4 0:表示获取name中的位,从零开始,获取4个位,返回一个有符号数字。