Table des matières
Qu'est-ce que BitMap ?
BitMap dans Redis
introduction à la commande setbit
Occupation de l'espace et temps requis pour la première allocation d'espace
Scénario d'utilisation 1 : connexion de l'utilisateur
Scénario d'utilisation 2 : comptez les utilisateurs actifs
Maison base de données Redis Analyser l'utilisation du bitmap dans Redis (explication d'exemples de scénarios)

Analyser l'utilisation du bitmap dans Redis (explication d'exemples de scénarios)

Jul 17, 2021 pm 04:02 PM
bitmap redis集群

Dans Redis, nous utilisons souvent set, get et d'autres commandes Si vous êtes prudent, avez-vous remarqué qu'il existe plusieurs commandes similaires appelées setbit et getbit. ?

Qu'est-ce que BitMap ?

représente la valeur ou le statut correspondant à un certain élément via un bit, et la clé est l'élément correspondant lui-même. Nous savons que 8 bits peuvent former un octet, donc le bitmap lui-même permettra d'économiser considérablement de l'espace de stockage.

BitMap dans Redis

Redis a ajouté plusieurs commandes liées au bitmap telles que setbit, getbit, bitcount, etc. à partir de la version 2.2.0. Bien qu'il s'agisse d'une nouvelle commande, aucun nouveau type de données n'est ajouté, car les commandes telles que setbit ne sont que des extensions de set.

introduction à la commande setbit

Command SETBIT key offset value
Complexity O(1)
Définissez ou effacez la valeur binaire de la valeur de la clé (chaîne) au offset (ne peut être que 0 ou 1).

Occupation de l'espace et temps requis pour la première allocation d'espace

Sur un MacBook Pro 2010, le décalage est de 2 ^ 32-1 (512 Mo alloués) et cela prend environ 300 ms, et le décalage est de 2 ^ 30-1 (128 Mo alloués)) prend environ 80 ms, le décalage est de 2 ^ 28-1 (32 Mo alloués) prend environ 30 ms, le décalage est de 2 ^ 26-1 (8 Mo alloués) prend 8 ms.
La formule approximative de calcul de l'occupation de l'espace est : ($offset/8/1024/1024)MB

Scénario d'utilisation 1 : connexion de l'utilisateur

De nombreux sites Web proposent des fonctions de connexion (non prises en compte ici) La mise en œuvre des données est importante) et doit afficher le statut d'enregistrement au cours du mois dernier. Que devons-nous faire si un bitmap est utilisé ? Le code se dévoile en un mot !

<?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;
Copier après la connexion

Scénario d'utilisation 2 : comptez les utilisateurs actifs

Utilisez le temps comme clé de cache, puis l'ID utilisateur est compensé s'il est actif ce jour-là, définissez-le sur 1
Alors, comment dois-je calculer les utilisateurs actifs certains jours/mois/. ans ? (Pour le moment, il est convenu que si vous n'êtes en ligne qu'un jour au cours de la période statistique, cela est dit actif). Veuillez donner la prochaine commande redis
Command BITOP opération destkey key [key...]
Explication : Une ou plusieurs chaînes qui enregistrent les bits binaires. Key effectue des opérations sur les bits et enregistre le résultat dans destkey.
Remarque : la commande BITOP prend en charge n'importe quel paramètre des quatre opérations AND, OR, NOT et

Scénario d'utilisation trois : statut en ligne de l'utilisateur

J'ai développé un projet il y a quelque temps et l'autre partie m'a fourni une interface pour demander si l'utilisateur actuel est en ligne. Je ne sais pas comment l'autre partie fait, alors j'y ai pensé moi-même. L'utilisation du bitmap est une méthode efficace et peu encombrante. Elle ne nécessite qu'une seule clé, puis l'ID utilisateur est décalé. est défini sur 1, et s'il n'est pas en ligne, il est défini sur 1. 0. Comme dans le scénario ci-dessus, un utilisateur de 5 000 W n'a besoin que de 6 Mo d'espace.
//日期对应的活跃用户
$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;
Copier après la connexion
Apprentissage recommandé : "

Tutoriel vidéo Redis

"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Implémentation du cluster Redis à l'aide de ThinkPHP6 Implémentation du cluster Redis à l'aide de ThinkPHP6 Jun 20, 2023 am 08:36 AM

Avec le développement rapide d’Internet, le problème de la concurrence élevée est devenu de plus en plus important. En réponse à ce problème, l'émergence de Redis est devenue une solution importante. Elle résout le problème de la pression excessive de lecture et d'écriture dans les bases de données relationnelles traditionnelles grâce à la lecture et à l'écriture de la mémoire. Cependant, Redis à nœud unique présente toujours des goulots d'étranglement en termes de performances dans des conditions de concurrence élevée, des clusters Redis doivent donc être utilisés. Cet article décrira comment utiliser ThinkPHP6 pour implémenter un cluster Redis. 1. Introduction à Redis Cluster Redis Cluster est un cluster officiel fourni par Redis.

Comment implémenter le déploiement en cluster du cache de données PHP via Redis ? Comment implémenter le déploiement en cluster du cache de données PHP via Redis ? Aug 10, 2023 am 08:13 AM

Comment implémenter le déploiement en cluster du cache de données PHP via Redis ? Introduction : Lorsque les applications PHP sont confrontées à une concurrence élevée et à un trafic important, elles rencontrent souvent des goulots d'étranglement dans les performances des bases de données. À l'heure actuelle, l'utilisation de la technologie de mise en cache peut considérablement améliorer les performances et la concurrence du système. En tant que base de données clé-valeur en mémoire hautes performances, Redis est largement utilisé dans la mise en œuvre de solutions de mise en cache. Cet article explique comment implémenter le déploiement en cluster du cache de données PHP via Redis pour améliorer encore les performances et l'évolutivité. 1. Présentation du cluster Redis Redis

Solution cluster Redis et Node.js : comment atteindre la haute disponibilité Solution cluster Redis et Node.js : comment atteindre la haute disponibilité Jul 29, 2023 pm 05:42 PM

Solution cluster pour Redis et Node.js : Comment atteindre une haute disponibilité Introduction : Avec le développement rapide d'Internet, le traitement des données est devenu de plus en plus volumineux et complexe. Afin de garantir la haute disponibilité et l'évolutivité du système, nous devons utiliser une architecture de cluster distribuée pour répondre aux besoins de stockage et de traitement de grandes quantités de données. Redis, en tant que base de données en mémoire hautes performances, combinée à Node.js comme langage de programmation back-end, peut créer une solution de cluster distribué hautement disponible. Cet article explique comment utiliser Redis et Node.js pour implémenter

Cluster Redis dans Redis et comment utiliser PHP Cluster Redis dans Redis et comment utiliser PHP May 15, 2023 pm 03:22 PM

Redis est une puissante base de données de stockage de paires clé-valeur en mémoire. Il offre des performances plus élevées et une meilleure évolutivité que les SGBDR (système de gestion de bases de données relationnelles) classiques. L’un des avantages de Redis est qu’il peut être utilisé comme technologie de base des systèmes distribués. Dans cet article, nous explorerons le concept de Redis Cluster et comment utiliser Redis Cluster en PHP. Qu'est-ce que le cluster Redis ? En termes simples, un cluster Redis est une agrégation de plusieurs instances Redis. Le cluster Redis nous permet

Apprenez les fonctions de base de données en langage Go et implémentez les opérations de lecture et d'écriture dans le cluster Redis Apprenez les fonctions de base de données en langage Go et implémentez les opérations de lecture et d'écriture dans le cluster Redis Jul 29, 2023 pm 12:21 PM

Apprenez les fonctions de base de données en langage Go et implémentez les opérations de lecture et d'écriture dans le cluster Redis Introduction : La base de données est un élément indispensable des applications Internet actuelles, et le langage Go, en tant que langage de programmation simple et efficace, possède également de bonnes capacités d'exploitation de base de données. Cet article expliquera comment utiliser les fonctions de base de données en langage Go et implémenter les opérations de lecture et d'écriture dans le cluster Redis. 1. Fonctions de base de données en langage Go Les opérations de base de données en langage Go sont principalement implémentées via le package database/sql. Ce package fournit des données de base

Solution de cluster Redis et PHP : comment atteindre une haute disponibilité et une évolutivité Solution de cluster Redis et PHP : comment atteindre une haute disponibilité et une évolutivité Jul 30, 2023 pm 08:51 PM

Solution de cluster de Redis et PHP : Comment atteindre une haute disponibilité et une évolutivité Introduction : Redis est une base de données en mémoire open source hautes performances qui est souvent utilisée pour créer des applications rapides et évolutives. En tant que langage de script côté serveur populaire, PHP peut être utilisé avec Redis pour obtenir des solutions de cluster haute disponibilité et évolutivité. Cet article présentera comment utiliser Redis et PHP pour créer un cluster à haute disponibilité et évolutif, et expliquera en détail à travers des exemples de code. 1. Construction, installation et configuration du cluster Redis Re

Comment utiliser les langages Redis et Julia pour implémenter des fonctions de cluster à haute disponibilité Comment utiliser les langages Redis et Julia pour implémenter des fonctions de cluster à haute disponibilité Sep 20, 2023 am 10:58 AM

Comment utiliser les langages Redis et Julia pour implémenter des fonctions de cluster à haute disponibilité Introduction : Avec le développement des activités Internet, les exigences en matière de disponibilité du système sont de plus en plus élevées. Pour garantir que les systèmes puissent continuer à fournir des services en cas de panne, la haute disponibilité est devenue l'une des exigences clés dans diverses industries. Cet article expliquera comment utiliser les langages Redis et Julia pour implémenter des fonctions de cluster à haute disponibilité et fournira des exemples de code spécifiques. 1. Qu'est-ce qu'un cluster haute disponibilité ? Un cluster haute disponibilité organise plusieurs nœuds ensemble pour former un système global.

Comment utiliser Bitmap dans Redis Comment utiliser Bitmap dans Redis May 31, 2023 pm 09:40 PM

Dans le processus de développement quotidien, il faut souvent accéder à des données de type booléen. Par exemple, si vous enregistrez le nombre de fois qu'un utilisateur s'est enregistré au cours d'une année, ce sera 1 si vous êtes connecté et 0 si vous n'êtes pas connecté. Si la clé-valeur est utilisée pour le stockage, chaque utilisateur sera enregistré 365 fois. Lorsqu'il y aura des centaines de millions d'utilisateurs, l'espace de stockage requis sera très énorme. Pour résoudre ce problème, vous pouvez utiliser des bitmaps dans Redis. Bitmap appartient également au type de données chaîne. Une valeur de type chaîne dans Redis peut stocker jusqu'à 512 Mo de contenu. Chaque chaîne est composée de plusieurs octets et chaque octet est composé de 8 bits. La structure bitmap utilise des « bits » pour réaliser le stockage. Elle atteint l'objectif d'accès aux données en définissant les bits sur 0 ou 1.

See all articles