bitmap 位图在大量数据统计中应用十分广泛,Redis 中提供的 bitmap 数据类型用于位图计数
bitmap
Bitmap 是一串连续的二进制数组,每一位值均为0或者1,每一位所在位置为 offset,在实际应用中0和1分别可以代表不同的含义,如1表示 offset 对应的值存在,0表示不存在,通过对 bitmap 进行各种位运算,就能实现特定的统计需求
redis 命令
SETBIT key offset value
:将键 key 所在 bitmap 偏移量 offset 处设为 value,value 为 0 或 1GETBIT key offset
:获取键 key 所在 bitmap 中偏移位置 offset 处的值BITCOUNT key [start] [end]
:统计键 key 所在 bitmap 中值为 1 的数量,start 和 end 可以指定查询范围,end 为负数表示倒序,-1 表示最后一位(倒数第一位),BITCOUNT key 0 -1
表示查询全部位置BITOP operation destkey key [key ...]
:对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上, operation 可选的值为:AND
、OR
、NOT
、XOR
,分别表示“按位与”、“按位或”、“按位取反”和“异或”
应用场景:统计特定时间段内的活跃用户
每个用户已都有唯一 UID,可以对应到 bitmap 中的不同 offset,设置一个名为 visit:yyyy-mm-dd 的 key
,记录系统中所有用户访问情况的 bitmap
- 某个用户(UID)访问系统时,
SETBIT visit:yyyy-mm-dd UID 1
- 获取 2019-01 月份内访问用户的 bitmap
BITOP OR total:2019-01 visit:2019-01-01 visit:2019-01-02 ... visit:2019-01-31
- 获取 2019-01 月活量:
BITCOUNT total:2019-01 0 -1
NOTE:bitmap 在海量数据统计中性价比最高,如果是数据量不够大,
set
和zset
数据类型反倒更适合