作者:专情与你2602899315 | 来源:互联网 | 2023-05-19 08:55
BitMap是什么Bitmap(即Bitset)Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),bitmap就是通过最小的单位bit来进行0或者1
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;