BitMap是什么
  Bitmap(即Bitset)
      Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。

  Redis中的BitMap
    Redis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在set上的扩展。在bitmap上可执行AND,OR,XOR以及其它位操作。

方法列表

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的个数

参数:[key, start ,offset] (是以byte为单位不是bit)

返回值:LONG

bitOp

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

参数:operation destkey key [key …]

返回值:LONG

 

$redis = new Redis;
$redis->pconnect('127.0.0.1',6379);
$redis->select(3);
$redis->flushDb();

// 写个签到的小栗子
function createKey($date) {
    return 'signin:'.$date;
}
$startDate = strtotime('20190718');
$dateFormat = 'Ymd';
for ($i=0; $i <= 2; $i++) { 
    
    //统计日期
    $date = date($dateFormat,$startDate+($i*86400));
    
    echo '-------记录日期-'.$date.'--------'.PHP_EOL;
    $key = createKey($date);

    for($userId=1;$userId<=10000;$userId++) {
        $redis->setbit($key,$userId,random_int(0,1));
    }
}

$redis->bitop('AND', 'threeSigninAnd', createKey('20190718'), createKey('20190719'), createKey('20190720'));
echo "连续三天都签到的用户数量:" . $redis->bitCount('threeSigninAnd').PHP_EOL;

$redis->bitop('OR', 'threeSigninOr', createKey('20190718'), createKey('20190719'), createKey('20190720'));
echo "三天内有签到的用户" . $redis->bitCount('threeSigninOr').PHP_EOL;

 

posted on 2019-07-18 10:27  沉默的土豆  阅读(376)  评论(0编辑  收藏  举报