Bitmap
BitMap 原本的含义是用一个比特位来映射某个元素的状态。由于一个比特位只能表示 0 和 1 两种状态,所以 BitMap 能映射的状态有限,但是使用比特位的优势是能大量的节省内存空间
可以把 Bitmap 想象成一个以比特位为单位的数组,数组的每个单元只能存储0和1,数组的下标在 Bitmap 中叫做偏移量;
注意:Redis 其实只支持 5 种数据类型,并没有 BitMap 这种类型,BitMap 底层是基于 Redis 的字符串类型实现的。
Redis 中字符串的最大长度是2^32bit= 512M,C语言中字符串的末尾都要存储一位分隔符,所以实际上 BitMap 的 offset 值上限是2^32 - 1
bitmap的相关命令:
1、设置值,其中value只能是 0 和 1
setbit key offset value
2、获取值
getbit key offset
3、获取指定范围内值为bit位为1的个数(区间统计不建议使用,bitcount用的是byte来计算位数(范围的单位是byte,两者差了8倍),其他setbit和getbit用的是bit),不加范围使用的查询所有
BITCOUNT key [start end]
3、BitMap间的运算:BITOP 支持四种表达式运算: AND(交集), OR(并集), XOR(异或) 和NOT(取非), 用法如下:
BITOP AND destkey srckey1 srckey2 srckey3 … srckeyN
BITOP OR destkey srckey1 srckey2 srckey3 … srckeyN
BITOP XOR destkey srckey1 srckey2 srckey3 … srckeyN
BITOP NOT destkey srckey
result 计算的结果,会存储在该destkey 中,not运算只能一个key
4、BITPOS key bit [start] [end]
返回设置为1或0(bit)的一个字符串中的第一个点的offset位置
bitmap的使用场景:
1、用户签到:
很多网站都提供了签到功能,并且需要展示最近一个月的签到情况,这种情况可以使用 BitMap 来实现。
命令为:setbit userId:2022 (今天是一年中的第几天) % (今年的天数) 1
2、活跃用户统计(用户登陆情况):
使用日期作为 key,然后用户 id 为 offset,如果当日活跃过就设置为1。具体怎么样才算活跃这个标准大家可以自己指定。
命令为:Setbit 2022315 userId 1<