Table of Contents
What is BitMap
BitMap in Redis
setbit command introduction
Space occupation, and the time required to allocate space for the first time
Usage scenario 1: User sign-in
Usage scenario two: counting active users
Home Database Redis Analyze the usage of bitmap in Redis (explanation of sample scenarios)

Analyze the usage of bitmap in Redis (explanation of sample scenarios)

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

In Redis we often use set, get and other commands. If you are careful, have you noticed that there are several similar commands? They are called setbit and getbit. What are they used for?

What is BitMap

It uses a bit to represent the value or status corresponding to an element, and the key is the corresponding element itself. We know that 8 bits can form a Byte, so the bitmap itself will greatly save storage space.

BitMap in Redis

Redis has added several bitmap-related commands such as setbit, getbit, bitcount, etc. starting from version 2.2.0. Although it is a new command, no new data types are added, because commands such as setbit are just extensions of set.

setbit command introduction

Command SETBIT key offset value
Complexity O(1)
Set or clear the value (string) of the key at offset The bit value at (can only be 0 or 1).

Space occupation, and the time required to allocate space for the first time

On a 2010 MacBook Pro, the offset is 2^32-1 (512MB allocated) ~ 300ms, offset is 2^30-1 (allocated 128MB) takes ~80ms, offset is 2^28-1 (allocated 32MB) takes ~30ms, offset is 2^26-1 (allocated 8MB) takes 8ms.
The approximate space occupation calculation formula is: ($offset/8/1024/1024)MB

Usage scenario 1: User sign-in

Many websites provide a check-in function (data implementation is not considered here), and need to display the check-in status in the past month. How do we use bitmap? The code is revealed in one word!

<?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;
Copy after login

Usage scenario two: counting active users

Use time as the cacheKey, and then the user ID is offset. If it is active that day, set it to 1
Then I How to calculate the active users on certain days/months/years (for the time being, it is agreed that only one day online during the statistical period is called active), please use the next redis command
Command BITOP operation destkey key [key .. .]
Description: Perform bit operations on one or more string keys that store binary bits, and save the results to destkey.
Note: The BITOP command supports any parameter of the four operations AND, OR, NOT, and /1024=6MB

Usage scenario three: User online status

I developed a project some time ago, and the other party provided me with an interface to query whether the current user is online. I don’t know how the other party does it, so I thought about it myself. Using bitmap is a space-saving and efficient method. It only requires one key, and then the user ID is offset. If it is online, it is set to 1, and if it is not online, it is set to 1. 0. Same as the above scenario, a 5000W user only needs 6MB of space.

//日期对应的活跃用户
$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;
Copy after login

Recommended learning: "

redis video tutorial

"

The above is the detailed content of Analyze the usage of bitmap in Redis (explanation of sample scenarios). For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Implementing Redis cluster using ThinkPHP6 Implementing Redis cluster using ThinkPHP6 Jun 20, 2023 am 08:36 AM

With the rapid development of the Internet, the problem of high concurrency has become more and more prominent. In response to this problem, the emergence of Redis has become an important solution. It solves the problem of excessive reading and writing pressure in traditional relational databases through memory reading and writing. However, single-node Redis still has performance bottlenecks under high concurrency conditions, so Redis clusters need to be used. This article will describe how to use ThinkPHP6 to implement a Redis cluster. 1. Introduction to Redis Cluster Redis Cluster is an official cluster provided by Redis.

How to implement cluster deployment of PHP data cache through Redis? How to implement cluster deployment of PHP data cache through Redis? Aug 10, 2023 am 08:13 AM

How to implement cluster deployment of PHP data cache through Redis? Introduction: When PHP applications face high concurrency and large traffic, they often encounter database performance bottlenecks. At this time, using caching technology can greatly improve the performance and concurrency of the system. As a high-performance in-memory key-value database, Redis is widely used in the implementation of caching solutions. This article will introduce how to implement cluster deployment of PHP data cache through Redis to further improve performance and scalability. 1. Overview of Redis Cluster Redis

Redis and Node.js cluster solution: how to achieve high availability Redis and Node.js cluster solution: how to achieve high availability Jul 29, 2023 pm 05:42 PM

Cluster solution for Redis and Node.js: How to achieve high availability Introduction: With the rapid development of the Internet, data processing has become increasingly large and complex. In order to ensure high availability and scalability of the system, we need to use a distributed cluster architecture to handle the needs of storing and processing large amounts of data. Redis, as a high-performance in-memory database, combined with Node.js as the back-end programming language, can build a highly available distributed cluster solution. This article will introduce how to use Redis and Node.js to implement

Redis cluster in Redis and how to use PHP Redis cluster in Redis and how to use PHP May 15, 2023 pm 03:22 PM

Redis is a powerful in-memory key-value pair storage database. It has higher performance and better scalability than regular RDBMS (relational database management system). One of the advantages of Redis is that it can be used as the core technology of distributed systems. In this article, we will explore the concept of Redis Cluster and how to use Redis Cluster in PHP. What is Redis cluster? Simply put, a Redis cluster is an aggregation of multiple Redis instances. Redis cluster allows us

Learn database functions in Go language and implement read and write operations in Redis cluster Learn database functions in Go language and implement read and write operations in Redis cluster Jul 29, 2023 pm 12:21 PM

Learn the database functions in Go language and implement read and write operations in Redis cluster Introduction: Database is an indispensable part of today's Internet applications, and Go language, as a simple and efficient programming language, also has good database operation capabilities. This article will introduce how to use database functions in Go language and implement read and write operations in Redis cluster. 1. Database functions in Go language Database operations in Go language are mainly implemented through the database/sql package. This package provides basic data

Redis and PHP cluster solution: how to achieve high availability and scalability Redis and PHP cluster solution: how to achieve high availability and scalability Jul 30, 2023 pm 08:51 PM

Redis and PHP cluster solution: How to achieve high availability and scalability Introduction: Redis is an open source, high-performance in-memory database that is often used to build fast and scalable applications. As a popular server-side scripting language, PHP can be used with Redis to achieve high availability and scalability cluster solutions. This article will introduce how to use Redis and PHP to build a high-availability and scalable cluster, and explain in detail through code examples. 1. Construction, installation and configuration of Redis cluster Re

How to use Redis and Julia languages ​​to implement high-availability cluster functions How to use Redis and Julia languages ​​to implement high-availability cluster functions Sep 20, 2023 am 10:58 AM

How to use Redis and Julia languages ​​to implement high-availability cluster functions Introduction: With the development of Internet business, the requirements for system availability are getting higher and higher. To ensure that systems can continue to provide services in the event of a failure, high availability has become one of the key requirements in various industries. This article will introduce how to use Redis and Julia languages ​​to implement high-availability cluster functions, and provide specific code examples. 1. What is a high-availability cluster? A high-availability cluster organizes multiple nodes together to form an overall system.

How to use Bitmap in Redis How to use Bitmap in Redis May 31, 2023 pm 09:40 PM

In the daily development process, there are often some bool type data that need to be accessed. For example, if you record the number of times a user has checked in within a year, it will be 1 if you have signed in, and 0 if you have not signed in. If key-value is used for storage, each user will be recorded 365 times. When there are hundreds of millions of users, the storage space required will be very huge. To solve this problem, you can use bitmaps in redis. Bitmap also belongs to the string data type. A string type value in Redis can store up to 512MB of content. Each string is composed of multiple bytes, and each byte is composed of 8 Bits. The bitmap structure uses "bits" to achieve storage. It achieves the purpose of data access by setting the bits to 0 or 1.

See all articles