Jadual Kandungan
BitMap是什么
Redis中的BitMap
setbit命令介绍
空间占用、以及第一次分配空间需要的时间
使用场景一:用户签到
使用场景二:统计活跃用户
使用场景三:用户在线状态
Rumah pangkalan data Redis 分析Redis中bitmap的用法(示例场景讲解)

分析Redis中bitmap的用法(示例场景讲解)

Jul 17, 2021 pm 04:02 PM
bitmap kelompok redis

在Redis中我们经常用到set,get等命令,细心的你有没有发现,还有几个相似的命令叫setbit,getbit,它们是用来干嘛的?

BitMap是什么

就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。

Redis中的BitMap

Redis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在set上的扩展。

setbit命令介绍

指令 SETBIT key offset value  
复杂度 O(1)  
设置或者清空key的value(字符串)在offset处的bit值(只能0或者1)。

空间占用、以及第一次分配空间需要的时间

在一台2010MacBook Pro上,offset为2^32-1(分配512MB)需要~300ms,offset为2^30-1(分配128MB)需要~80ms,offset为2^28-1(分配32MB)需要~30ms,offset为2^26-1(分配8MB)需要8ms。<来自官方文档>  
大概的空间占用计算公式是:($offset/8/1024/1024)MB

使用场景一:用户签到

很多网站都提供了签到功能(这里不考虑数据落地事宜),并且需要展示最近一个月的签到情况,如果使用bitmap我们怎么做?一言不合亮代码!

<?php
$redis = new Redis();
$redis->connect('127.0.0.1');

//用户uid
$uid = 1;

//记录有uid的key
$cacheKey = sprintf("sign_%d", $uid);

//开始有签到功能的日期
$startDate = '2017-01-01';

//今天的日期
$todayDate = '2017-01-21';

//计算offset
$startTime = strtotime($startDate);
$todayTime = strtotime($todayDate);
$offset = floor(($todayTime - $startTime) / 86400);

echo "今天是第{$offset}天" . PHP_EOL;

//签到
//一年一个用户会占用多少空间呢?大约365/8=45.625个字节,好小,有木有被惊呆?
$redis->setBit($cacheKey, $offset, 1);

//查询签到情况
$bitStatus = $redis->getBit($cacheKey, $offset);
echo 1 == $bitStatus ? '今天已经签到啦' : '还没有签到呢';
echo PHP_EOL;

//计算总签到次数
echo $redis->bitCount($cacheKey) . PHP_EOL;

/**
* 计算某段时间内的签到次数
* 很不幸啊,bitCount虽然提供了start和end参数,但是这个说的是字符串的位置,而不是对应"位"的位置
* 幸运的是我们可以通过get命令将value取出来,自己解析。并且这个value不会太大,上面计算过一年一个用户只需要45个字节
* 给我们的网站定一个小目标,运行30年,那么一共需要1.31KB(就问你屌不屌?)
*/
//这是个错误的计算方式
echo $redis->bitCount($cacheKey, 0, 20) . PHP_EOL;
Salin selepas log masuk

使用场景二:统计活跃用户

使用时间作为cacheKey,然后用户ID为offset,如果当日活跃过就设置为1  
那么我该如果计算某几天/月/年的活跃用户呢(暂且约定,统计时间内只有有一天在线就称为活跃),有请下一个redis的命令  
命令 BITOP operation destkey key [key ...]  
说明:对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。  
说明:BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数

//日期对应的活跃用户
$data = array(
'2017-01-10' => array(1,2,3,4,5,6,7,8,9,10),
'2017-01-11' => array(1,2,3,4,5,6,7,8),
'2017-01-12' => array(1,2,3,4,5,6),
'2017-01-13' => array(1,2,3,4),
'2017-01-14' => array(1,2)
);

//批量设置活跃状态
foreach($data as $date=>$uids) {
  $cacheKey = sprintf("stat_%s", $date);
  foreach($uids as $uid) {
    $redis->setBit($cacheKey, $uid, 1);
  }
}

$redis->bitOp('AND', 'stat', 'stat_2017-01-10', 'stat_2017-01-11', 'stat_2017-01-12') . PHP_EOL;
//总活跃用户:6
echo "总活跃用户:" . $redis->bitCount('stat') . PHP_EOL;

$redis->bitOp('AND', 'stat1', 'stat_2017-01-10', 'stat_2017-01-11', 'stat_2017-01-14') . PHP_EOL;
//总活跃用户:2
echo "总活跃用户:" . $redis->bitCount('stat1') . PHP_EOL;

$redis->bitOp('AND', 'stat2', 'stat_2017-01-10', 'stat_2017-01-11') . PHP_EOL;
//总活跃用户:8
echo "总活跃用户:" . $redis->bitCount('stat2') . PHP_EOL;
Salin selepas log masuk

假设当前站点有5000W用户,那么一天的数据大约为50000000/8/1024/1024=6MB

使用场景三:用户在线状态

前段时间开发一个项目,对方给我提供了一个查询当前用户是否在线的接口。不了解对方是怎么做的,自己考虑了一下,使用bitmap是一个节约空间效率又高的一种方法,只需要一个key,然后用户ID为offset,如果在线就设置为1,不在线就设置为0,和上面的场景一样,5000W用户只需要6MB的空间。

//批量设置在线状态
$uids = range(1, 500000);
foreach($uids as $uid) {
  $redis->setBit('online', $uid, $uid % 2);
}
//一个一个获取状态
$uids = range(1, 500000);
$startTime = microtime(true);
foreach($uids as $uid) {
  echo $redis->getBit('online', $uid) . PHP_EOL;
}
$endTime = microtime(true);
//在我的电脑上,获取50W个用户的状态需要25秒
echo "total:" . ($endTime - $startTime) . "s";

/**
* 对于批量的获取,上面是一种效率低的办法,实际可以通过get获取到value,然后自己计算
* 具体计算方法改天再写吧,之前写的代码找不见了。。。
*/
Salin selepas log masuk

推荐学习:《redis视频教程

Atas ialah kandungan terperinci 分析Redis中bitmap的用法(示例场景讲解). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Melaksanakan kelompok Redis menggunakan ThinkPHP6 Melaksanakan kelompok Redis menggunakan ThinkPHP6 Jun 20, 2023 am 08:36 AM

Dengan perkembangan pesat Internet, masalah konkurensi yang tinggi telah menjadi semakin ketara. Sebagai tindak balas kepada masalah ini, kemunculan Redis telah menjadi penyelesaian penting Ia menyelesaikan masalah tekanan membaca dan menulis yang berlebihan dalam pangkalan data hubungan tradisional melalui pembacaan dan penulisan memori. Walau bagaimanapun, Redis nod tunggal masih mempunyai kesesakan prestasi di bawah keadaan konkurensi yang tinggi, jadi kelompok Redis perlu digunakan. Artikel ini akan menerangkan cara menggunakan ThinkPHP6 untuk melaksanakan gugusan Redis. 1. Pengenalan Kluster Redis Kluster Redis ialah kluster rasmi yang disediakan oleh Redis.

Bagaimana untuk melaksanakan penyebaran kluster cache data PHP melalui Redis? Bagaimana untuk melaksanakan penyebaran kluster cache data PHP melalui Redis? Aug 10, 2023 am 08:13 AM

Bagaimana untuk melaksanakan penyebaran kluster cache data PHP melalui Redis? Pengenalan: Apabila aplikasi PHP menghadapi konkurensi tinggi dan trafik yang besar, mereka sering menghadapi kesesakan prestasi pangkalan data Pada masa ini, menggunakan teknologi caching boleh meningkatkan prestasi dan keselarasan sistem. Sebagai pangkalan data nilai kunci dalam memori berprestasi tinggi, Redis digunakan secara meluas dalam pelaksanaan penyelesaian caching. Artikel ini akan memperkenalkan cara melaksanakan penempatan kluster cache data PHP melalui Redis untuk meningkatkan lagi prestasi dan kebolehskalaan. 1. Gambaran Keseluruhan Redis Cluster Redis

Penyelesaian kluster Redis dan Node.js: cara mencapai ketersediaan tinggi Penyelesaian kluster Redis dan Node.js: cara mencapai ketersediaan tinggi Jul 29, 2023 pm 05:42 PM

Penyelesaian kluster untuk Redis dan Node.js: Cara mencapai ketersediaan tinggi Pengenalan: Dengan perkembangan pesat Internet, pemprosesan data menjadi semakin besar dan kompleks. Untuk memastikan ketersediaan tinggi dan kebolehskalaan sistem, kami perlu menggunakan seni bina kluster teragih untuk mengendalikan keperluan menyimpan dan memproses sejumlah besar data. Redis, sebagai pangkalan data dalam memori berprestasi tinggi, digabungkan dengan Node.js sebagai bahasa pengaturcaraan bahagian belakang, boleh membina penyelesaian kluster teragih yang sangat tersedia. Artikel ini akan memperkenalkan cara menggunakan Redis dan Node.js untuk dilaksanakan

Kelompok Redis dalam Redis dan cara menggunakan PHP Kelompok Redis dalam Redis dan cara menggunakan PHP May 15, 2023 pm 03:22 PM

Redis ialah pangkalan data simpanan pasangan nilai kunci dalam memori yang berkuasa. Ia mempunyai prestasi yang lebih tinggi dan skalabiliti yang lebih baik daripada RDBMS biasa (sistem pengurusan pangkalan data hubungan). Salah satu kelebihan Redis ialah ia boleh digunakan sebagai teknologi teras sistem teragih. Dalam artikel ini, kita akan meneroka konsep Redis Cluster dan cara menggunakan Redis Cluster dalam PHP. Apakah kluster Redis? Ringkasnya, gugusan Redis ialah himpunan berbilang kejadian Redis. Kelompok Redis membolehkan kami

Ketahui fungsi pangkalan data dalam bahasa Go dan laksanakan operasi baca dan tulis dalam kelompok Redis Ketahui fungsi pangkalan data dalam bahasa Go dan laksanakan operasi baca dan tulis dalam kelompok Redis Jul 29, 2023 pm 12:21 PM

Pelajari fungsi pangkalan data dalam bahasa Go dan laksanakan operasi baca dan tulis dalam kelompok Redis Pengenalan: Pangkalan data merupakan bahagian yang amat diperlukan dalam aplikasi Internet hari ini, dan bahasa Go, sebagai bahasa pengaturcaraan yang mudah dan cekap, juga mempunyai keupayaan operasi pangkalan data yang baik. Artikel ini akan memperkenalkan cara menggunakan fungsi pangkalan data dalam bahasa Go dan melaksanakan operasi baca dan tulis dalam kelompok Redis. 1. Fungsi pangkalan data dalam bahasa Go Operasi pangkalan data dalam bahasa Go dilaksanakan terutamanya melalui pakej pangkalan data/sql. Pakej ini menyediakan data asas

Penyelesaian kluster Redis dan PHP: bagaimana untuk mencapai ketersediaan dan kebolehskalaan yang tinggi Penyelesaian kluster Redis dan PHP: bagaimana untuk mencapai ketersediaan dan kebolehskalaan yang tinggi Jul 30, 2023 pm 08:51 PM

Penyelesaian kluster Redis dan PHP: Cara mencapai ketersediaan dan kebolehskalaan tinggi Pengenalan: Redis ialah pangkalan data dalam memori berprestasi tinggi sumber terbuka yang sering digunakan untuk membina aplikasi yang pantas dan berskala. Sebagai bahasa skrip sebelah pelayan yang popular, PHP boleh digunakan dengan Redis untuk mencapai ketersediaan tinggi dan penyelesaian kluster berskala. Artikel ini akan memperkenalkan cara menggunakan Redis dan PHP untuk membina kluster ketersediaan tinggi dan berskala serta menerangkan secara terperinci melalui contoh kod. 1. Pembinaan, pemasangan dan konfigurasi gugusan Redis Re

Cara menggunakan bahasa Redis dan Julia untuk melaksanakan fungsi kelompok ketersediaan tinggi Cara menggunakan bahasa Redis dan Julia untuk melaksanakan fungsi kelompok ketersediaan tinggi Sep 20, 2023 am 10:58 AM

Cara menggunakan bahasa Redis dan Julia untuk melaksanakan fungsi kluster ketersediaan tinggi Pengenalan: Dengan perkembangan perniagaan Internet, keperluan untuk ketersediaan sistem semakin tinggi dan lebih tinggi. Untuk memastikan sistem boleh terus menyediakan perkhidmatan sekiranya berlaku kegagalan, ketersediaan yang tinggi telah menjadi salah satu keperluan utama dalam pelbagai industri. Artikel ini akan memperkenalkan cara menggunakan bahasa Redis dan Julia untuk melaksanakan fungsi kelompok ketersediaan tinggi dan memberikan contoh kod khusus. 1. Apakah kluster ketersediaan tinggi? Kluster ketersediaan tinggi menyusun berbilang nod bersama-sama untuk membentuk sistem keseluruhan.

Cara menggunakan Bitmap dalam Redis Cara menggunakan Bitmap dalam Redis May 31, 2023 pm 09:40 PM

Dalam proses pembangunan harian, selalunya terdapat beberapa data jenis bool yang perlu diakses. Sebagai contoh, jika anda merekodkan bilangan kali pengguna telah mendaftar masuk dalam tempoh setahun, ia akan menjadi 1 jika anda telah log masuk dan 0 jika anda belum melog masuk. Jika nilai kunci digunakan untuk storan, setiap pengguna akan direkodkan sebanyak 365 kali Apabila terdapat ratusan juta pengguna, ruang storan yang diperlukan akan menjadi sangat besar. Untuk menyelesaikan masalah ini, anda boleh menggunakan bitmap dalam redis. Bitmap juga tergolong dalam jenis data rentetan. Nilai jenis rentetan dalam Redis boleh menyimpan sehingga 512MB kandungan Setiap rentetan terdiri daripada berbilang bait dan setiap bait terdiri daripada 8 Bit. Struktur bitmap menggunakan "bit" untuk mencapai storan Ia mencapai tujuan capaian data dengan menetapkan bit kepada 0 atau 1.

See all articles