一、bitmap介绍
bitmap,也叫位图,是一种实现对位的操作的'数据结构',用一个bit位来表示一个东西的状态,我们都知道bit位是二进制,所以只有两种状态,0和1。
- bitmap同样属于redis的string数据类型,Redis中一个字符串类型的值最多能存储512M的内容,每个字符由多个字节组成,一个字节由8个bit位构成,所以bitmap最多可以存储2^32位
- 虽然底层位string,但是redis为bitmap提供了一套单独的命令,所以用法区别与字符串,我们可以讲位图看成是数组,里面全是0和1表示的内容(二进制位数组),数组的下标在bitmap中叫做offest(偏移量)
bitmap的出现就是为了大数据量,但是前提是需要存储的内容只能由两种状态,因为每个bit只能表示两种状态
二、操作命令
1、setbit key offset value
给key值在指定索引位置上(offest)设置一个value,因为bit位所以value只能为0和1,否则会出现错误(error) ERR bit is not an integer or out of range,offest的范围为0-2^32,返回值为set之前的值,默认全部为0
2、getbit key offset
获取key在指定位置上的值,返回值为0或者1,如果未set,则默认为0
3、bitcount key [start end]
统计key在指定范围内的1的出现次数,0, -1或者不加参数表示统计全部
4、bitbops key bit [start end]
统计key中指定范围内的bit(0或1)第一次出现的索引位置,没有则返回-1
5、bittop operation destkey key [key ...]
将两个或者多个key的二进制位进行或、与的操作然后将结果赋值给新的key(destkey)
因为底层是字符串,所以我们可以用strlen命令查看一下bitmap存储所占用的长度,
strlen命令返回的是字符串所占用的长度,因为一个数字占用一个字节,而bit这个key只set偏移量为0的值,未开辟新的内存空间,所以strlen返回值为1
因为一个bit占8个字节,所以我们在索引位置为8的地方添加一个值
可以看到新开了一个字节空间,所以返回值为2
通过这样的设计,比如我们想实现一个100万个用户一年(365天)的签到情况只需要 365/8 * 100000 / 1048576=43.86M的空间
三、getbit理解
上面我们了解了到bitmap的占用空间小,还有一个特点是执行效率高,上述命令getbit key offest在0-2^32范围内获取到的bit时间复杂度竟然为O(1)
明天再写..