Bitmap 并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合。因为字符串是二进制安全的块,他们的最大长度是512M,最适合设置成2^32个不同字节。

Bitmap 的最大优势之一在存储信息时极其节约空间。例如,在一个以增量用户ID来标识不同用户的系统中,记录用户的四十亿的一个单独bit信息(例如,要知道用户是否想要接收最新的来信)仅仅使用512M内存。

setbit key offset value
 给位图指定索引设置值,返回该索引位置的原始值
//签到列表
127.0.0.1:6379> SETBIT sign 0 1
 (integer) 0
 127.0.0.1:6379> 
 127.0.0.1:6379> SETBIT sign 1 0
 (integer) 0
 127.0.0.1:6379> SETBIT sign 2 1
 (integer) 0
 127.0.0.1:6379> SETBIT sign 3 0
 (integer) 0
 127.0.0.1:6379> SETBIT sign 4 0
 (integer) 0
 127.0.0.1:6379> SETBIT sign 5 1
 (integer) 0
 127.0.0.1:6379> SETBIT sign 6 0
 (integer) 0
 ================================
getbit key offset
 获取位图指定索引的值
//查询签到情况
 127.0.0.1:6379> GETBIT sign 0
 (integer) 1
 127.0.0.1:6379> GETBIT sign 6
 (integer) 0
 127.0.0.1:6379> GETBIT sign 4
 (integer) 0
 127.0.0.1:6379> GETBIT sign 2
 (integer) 1
================================
bitcount key [start end]
 获取位图指定范围(start到end,单位为字节,如果不指定就是获取全部)位值为1的个数。
//总签到数
 127.0.0.1:6379> BITCOUNT sign
 (integer) 3

独立用户访问统计

  1. 使用 set 和 Bitmap (前提是用户的ID必须是整型)
  2. 1亿用户,五千万独立
数据类型每个userId占用空间需要存储的用户量内存使用总量
set32位(假设userId用的是integer)50,000,00032位*50,000,000=200MB
Bitmap1位100,000,0001位*100,000,000=12.5MB
  1. 若只有10万独立用户
数据类型每个userId占用空间需要存储的用户量内存使用总量
set32位(假设userId用的是整型)100,00032位*100,000=4MB
Bitmap1位100,000,0001位*100,000,000=12.5MB

应用场景

1、记录统计信息,状态:

活跃,不活跃,登录、未登录 ,打卡