登录 |  注册 |  繁體中文


redis BitMap的使用

分类: 服务器相关 颜色:橙色 默认  字号: 阅读(502) | 评论(0)

什么是 BitMap

BitMap,即位图,其实也就是 byte 数组,用二进制表示,只有 0 和 1 两个数字。
Redis 其实只支持 5 种数据类型,并没有 BitMap 这种类型,BitMap 底层是基于 Redis 的字符串类型实现的。
 
优势
 
1.基于最小的单位bit进行存储,所以非常省空间。 
2.设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的。 
3.二进制数据的存储,进行相关计算的时候非常快。 
4.方便扩容

注意 setbit 时的偏移量,可能有较大耗时

Redis 中字符串的最大长度是 512M,所以 BitMap 的 offset 值也是有上限的,其最大值是(OFFSET_MAX): 8 * 1024 * 1024 * 512 = 2^32

OFFSET 顺序从前往后排 0 -7| 8 - 15 ......
 

相关命令

# 设置值,其中value只能是 0 和 1
setbit key offset value

# 获取值
getbit key offset

# 获取指定范围内值为 1 的个数
# start 和 end 以字节为单位
bitcount key start end

# BitMap间的运算
# operations 位移操作符,枚举值
  AND 与运算 &
  OR 或运算 |
  XOR 异或 ^
  NOT 取反 ~
# result 计算的结果,会存储在该key中
# key1 … keyn 参与运算的key,可以有多个,空格分割,not运算只能一个key
# 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0。
# 返回值是保存到 destkey 的字符串的长度(以字节byte为单位),和输入 key 中最长的字符串长度相等。
bitop [operations] [result] [key1] [keyn…]

# 返回指定key中第一次出现指定value(0/1)的位置
bitpos [key] [value]

演示

使用场景

1. 用户签到

2. 统计活跃用户(用户登陆情况)

使用日期作为 key,然后用户ID为offset,如果当日活跃过就设置为1

$key1 = 'Userlogin2017-08-01';
$key2 = 'Userlogin2017-08-02';
$key3 = 'Userlogin2017-08-03';
 
##分别记录下 8月1号  和 8月2号 的活跃用户
 
$redis->setBit($key1, $uid, 1);
$redis->setBit($key2, $uid, 1);
 
##进行bitmap 计算统计1号2号都活跃的用户
 
$redis->bitOp('AND','8182',$key1,$key2);
$both_active = $redis->bitCount('8182');
 
##进行bitmap 计算统计1号 或 2号 或 3号 活跃的用户
 
$redis->bitOp('OR','818283',$key1,$key2,$key3);

 3. 统计用户是否在线

如果需要提供一个查询当前用户是否在线的接口,只需要一个 key,然后用户 id 为 offset,如果在线就设置为 1,不在线就设置为 0。

 $redis->setBit('online', $uid, 1);

4. 实现布隆过滤器




姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部