新数据类型-Bitmaps
简介
在计算机中,用二进制(位)作为存储信息的基本单位,1个字节等于8位。
例如 “abc” 字符串是由 3 个字节组成,计算机存储时使用其二进制表示,"abc"分别对应的ASCII码是 97、98、99,对应的二进制是01100001、01100010、01100011,在内存中表示如下:
合理地使用 位 能够有效地提高内存使用率和开发效率。
Redis提供了Bitmaps这个 “数据结构” 可以实现对位的操作:
-
Bitmaps 本身不是一种数据结构,实际上它就是字符串(key 对应的 value 就是上图中的一串二进 制),但是它可以对字符串的位进行操作。
-
Bitmaps 单独提供了一套命令,所以在 Redis 中使用 Bitmaps 和使用字符串的方法不太相同。可 以把 Bitmaps 想象成一个以位为单位的数组,数组的每个单元只能存储 0 和 1,数组的下标在 Bitmaps中叫做偏移量。
常用命令
-
setbit key offset value设置Bitmaps中某个偏移量的值。
偏移量从0开始,且value值只能为0或1。
setbit sign 0 1 设置sign的第一位值为1 setbit sign 1 1 设置sign的第二位值为1 setbit sign 2 0 设置sign的第三位值为0 setbit sign 3 1 设置sign的第四位值为1
-
getbit key offset 获取Bitmaps中某个偏移量的值。
获取key的offset 的值。
getbit sign 3 获取偏移量为3的值,结果为1
如果偏移量未设置值,则也返回0。
getbit sign 99 获取偏移量为99的值,结果为0
-
bitcount key [start end]统计字符串被设置为1的bit数量。一般情况下,给定的整个字符串都会 被进行统计,可以选择通过额外的start和end参数,指定字节组范围内进行统计(包括start和 end),0表示第一个元素,-1表示最后一个元素。
bitcount sign 获取整个字符串被设置为1的bit数量,结果为3
如:当前存在一个key为k1的bitmaps存储着[00000001,00000001,00000010,00000011],分别对 应[1,1,2,3]。
setbit num 7 1 setbit num 15 1 setbit num 22 1 setbit num 30 1 setbit num 31 1 bitcount num 1 2 统计索引1、2两个字节组中bit=1的数量,即统计00000001,00000010中 bit=1的数量,结果为2 bitcount num 1 3 统计索引1、2、3三个字节组中bit=1的数量,即统计 00000001,00000010,00000011中bit=1的数量,结果为4 bitcount num 0 -1 统计所有的字节组中bit=1的数量,结果为5
setbit设置或获取的是bit(位)的位置,bitcount计算的是byte(字节)位置。
-
bitop and/or destkey sourcekey1 sourcekey2……将多个bitmaps通过求交集/并集方式合并成 一个新的bitmaps。
bitop and k3 k1 k2 通过求交集将k1 k2合并成k3 bitop or k3 k1 k2 通过求并集将k1 k2合并成k3