加入收藏 | 设为首页 |

火锅底料-Redis高档用法:BitMap运用

海外新闻 时间: 浏览:326 次

BitMap介绍

Bitmap是一串接连的2进制数字(0或1),用1个bit位来表明一个数据是否呈现过,0为没有呈现过,1表明呈现过,运用的时分能够依据某一个位是否为0表明此数是否呈现过。8个bit能够组成一个Byte,所以bitmap自身会极大的节约贮存空间。

Redis中bitmap

Redis从2.2.0版别开端新增了setbit,getbit,bitcount等几个bitmap相关指令,虽然是新指令,可是并没有新增新的数据类型,由于setbit等指令只不过是在set上的扩展。

相关指令

  • setbit
  • 指令 SETBIT key offset value
  • 复杂度: O(1)
  • getbit
  • 指令 GETBIT key
  • 复杂度: O(1)
  • bitcount
  • 指令 BITCOUNT key
  • 复杂度: O(1)

运用场景

根据bitmap极低的时刻和空间复杂度,在大数据符号等相似布隆过滤的场景有广泛的用武之地。以在线用户计算为例,设置用户ID为offs火锅底料-Redis高档用法:BitMap运用et,假如在线就设置为1,不在线就设置为0,运用bitmap,1000W用户只需要1.2MB的空间。

require 'vendor/autoload.php';
$redis = new Predis\Client([
'host' => '127.0.0.1',
'port' => 6379
]);
// 衔接redis
$redis->connect();
// 上线
function online($uid)
{
global $redis;
$redis->setbit('on跑步机line', $uid, 1);
}
// 下线
function offline($uid)
{
global $redis;
$redis->setbit('online', $uid, 0);
}
// 判别是否在线
function isonl火锅底料-Redis高档用法:BitMap运用ine($uid)
{
global $redis;
$redis->getbit('online',火锅底料-Redis高档用法:BitMap运用 $uid);
}
// 在线计算
func火锅底料-Redis高档用法:BitMap运用tion total()
{
global $redis;
火锅底料-Redis高档用法:BitMap运用return $redis->bitcount('online');
}
// 批量设置在线状况
$uids = range(1, 10000);
foreach ($uids as $uid) {
online($uid);
}
// 批量设置下线状况
$i = 0;
$max = mt_rand(1000, 3000);
while ($i < $max) {
offline(mt_rand(1, 10000)火锅底料-Redis高档用法:BitMap运用);
$i++;
}
echo '当时在线人数: ', total(), PHP_EOL;