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 或 1
  • GETBIT 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 可选的值为:ANDORNOTXOR,分别表示“按位与”、“按位或”、“按位取反”和“异或”

应用场景:统计特定时间段内的活跃用户

每个用户已都有唯一 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 在海量数据统计中性价比最高,如果是数据量不够大,setzset 数据类型反倒更适合