闲谈redis的bitmap

bitmap的原理

bitmap就是通过最小的单位bit(8bit = 1b = 0.001kb)来进行0或者1的设置,表示某个元素对应的值或者状态。一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。

优点

  • 基于最小的单位bit进行存储,所以非常省空间。
  • 设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的。
  • 二进制数据的存储,进行相关计算的时候非常快。
  • 方便扩容

缺点

redis中bit映射被限制在512MB之内,所以最大是2^32位。建议每个key的位数都控制下,因为读取时候时间复杂度O(n),越大的串读的时间花销越多。

用法

setBit

给一个指定key的值得第offset位 赋值为value。

  • 参数:key offset value: bool or int (1 or 0)
  • 返回值:LONG: 0 or 1

getBit

返回一个指定key的二进制信息

  • 参数:key offset
  • 返回值:LONG

bitCount

返回一个指定key中位的值为1的个数(是以byte为单位不是bit)

  • 参数:key start offset
  • 返回值:LONG

bitOp

对不同的二进制存储数据进行位运算(AND、OR、NOT、XOR)

  • 参数:operation destkey key [key …]
  • 返回值:LONG

使用场景

用户在线状态

使用bitmap是一个节约空间效率又高的一种方法,只需要一个key,然后用户id为偏移量offset,如果在线就设置为1,不在线就设置为0,3亿用户只需要36MB的空间。

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

统计用户连续活跃天数

设定一个初始时间,往后没加一天即对应value中的offset的位置。

$start_date = '20170708';
$end_date = '20170709';
$offset = floor((strtotime($start_date) - strtotime($end_date)) / 86400);
$redis->setBit('sign_123456', $offset, 1);

//算活跃天数
$redis->bitCount('sign_123456', 0, -1)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值