简述
Redis提供了二进制数组(Bit arrays、simply bitmaps)的功能,并使用SETBIT、GETBIT、BITCOUNT、BITOP四个命令来操作二进制数组。
二进制数组的结构
二进制数组底层是通过SDS简单动态字符串来实现的,因为SDS是二进制安全的结构,SDS buf数组中的每一个元素可以存储8个bit,如一下结构,可以存储16个bit的操作数据。
操作命令
- SETBIT :把bit array的第bit位设置为value的值,value只能是0或者1。
- GETBIT :返回bit array的第bit位的二进制值。
- BITCOUNT :返回bit array中1的个数。
- BITOP :OP操作有AND(与)、OR(或)、XOR(异或)、NOT(非),该命令表示将array1和array2进行位操作,并把结构存入result中。
指令实现
定位
Redis用SDS的buf数组来存储二进制数组,每一个buf元素都存储八位,因此在定位时,首先要确认buf数组的下标(bit / 8),在确认在第几位(bit % 8 + 1)。有了定位的方法,设置和获取bit都是手到擒来,不过要注意设置的时候会涉及到buf数组的扩容问题。
扩容
假如当前buf的len是2,执行SETBIT array 65 1
,则要求长度应该是65 / 8 + 1 = 9,因此要对buf进行扩容,扩容之后len和free都为9(根据SDS的空间预留策略)。