1、BitMap 是什么
就是通过一个 bit 位来示意某个元素对应的值或者状态, 其中的 key 就是对应元素自身。咱们晓得 8 个 bit 能够组成一个 Byte,所以 bitmap 自身会极大的节俭贮存空间。
2、Redis 中的 BitMap
Redis 从 2.2.0 版本开始新增了 setbit
,getbit
,bitcount
等几个 bitmap 相干命令。尽管是新命令,然而并没有新增新的数据类型,因为 setbit
等命令只不过是在 set
上的扩大。
3、php 怎么操作 redis 的 bitMap
<?php
$redis = new Redis();
$redis->connect('127.0.0.1');
$cacheKey = 'bitmap';
// 咱们将 7,8,10 对应的地位设置为 1
$redis->setBit($cacheKey, 7, 1);
$redis->setBit($cacheKey, 8, 1);
$redis->setBit($cacheKey, 10, 1);
$value = $redis->get($cacheKey);
/**
* 解包(redis 返回来的是二进制字符串,咱们须要把它解成对应的数字)
* 对于 unpack 的用法,如果不理解,大家能够网上搜寻学习,改天能够独自写篇文章分享
*/
$bitmap = unpack('C*', $value);
print_r($bitmap);
}
后果:
Array
([1] => 1
[2] => 160
)
对于不太熟悉 bitMap 的可能会问,这是什么鬼,不是应该是 00000001101 这样吗?在第 7 8 10 三个地位是 1 其它都是 0,刚开始我也是这么认为的,然而起初发现跟我想的不一样,而后查了材料才发现,unpack 解包的时候,参数 C 是无符号字符。不懂的能够去看一下 pack 和 unpack。所以 unpack 返回的后果是两个值,1 和 160 是两个 byte 下面的值,1byte = 8 bit。所以 1 对对应的 bit 应为 00000001,160 对应的 bit 应为 10100000,所以最终后果应是 0000000110100000。