Maison >base de données >Redis >Comprendre le bitmap de Redis dans un article

Comprendre le bitmap de Redis dans un article

WBOY
WBOYavant
2022-04-27 19:48:015592parcourir

Cet article vous apporte des connaissances pertinentes sur Redis, qui présente principalement le problème du bitmap. Redis nous fournit la structure des données bitmap n'est pas en fait une toute nouvelle chose. Nous pouvons simplement la considérer comme un tableau. mais le contenu à l'intérieur ne peut être que 0 ou 1. J'espère que cela sera utile à tout le monde.

Comprendre le bitmap de Redis dans un article

Apprentissage recommandé : Tutoriel vidéo Redis

1. Introduction Bitmap

Si nous devons enregistrer si un utilisateur se connecte à notre système tous les jours pendant un an, comment devons-nous remplir cette exigence ? Si le stockage KV est utilisé, chaque utilisateur doit enregistrer 365 enregistrements. Lorsque le nombre d'utilisateurs atteint des centaines de millions, l'espace de stockage requis est stupéfiant.

Redis nous fournit la structure des données bitmap. L'enregistrement de connexion quotidien de chaque utilisateur n'occupe qu'un bit, soit 365 jours, et ne nécessite que 46 octets pour être stocké, ce qui permet d'économiser considérablement de l'espace de stockage.

La structure des données bitmap n'est en fait pas une nouveauté. Nous pouvons simplement la considérer comme un tableau, mais le contenu à l'intérieur ne peut être que 0 ou 1 (tableau de bits binaires).

2. Pratique des commandes

Redis fournit quatre SETBIT, GETBIT, BITCOUNT et BITOP commun. les commandes sont utilisées pour traiter des tableaux de bits binaires. SETBITGETBITBITCOUNTBITOP四个常用命令用于处理二进制位数组。

  • SETBIT:为位数组指定偏移量上的二进制位设置值,偏移量从0开始计数,二进制位的值只能为0或1。返回原位置值。
  • GETBIT:获取指定偏移量上二进制位的值。
  • BITCOUNT:统计位数组中值为1的二进制位数量。
  • BITOP:对多个位数组进行按位与、或、异或运算。
127.0.0.1:6379> SETBIT first 0 1    # 0000 0001
(integer) 0
127.0.0.1:6379> SETBIT first 3 1    # 0000 1001
(integer) 0
127.0.0.1:6379> SETBIT first 0 0    # 0000 1000
(integer) 1

127.0.0.1:6379> GETBIT first 0
(integer) 0
127.0.0.1:6379> GETBIT first 3
(integer) 1

127.0.0.1:6379> BITCOUNT first      # 0000 1000
(integer) 1
127.0.0.1:6379> SETBIT first 0 1    # 0000 1001
(integer) 0
127.0.0.1:6379> BITCOUNT first      # 0000 1001
(integer) 2
127.0.0.1:6379> SETBIT first 1 1    # 0000 1011
(integer) 0
127.0.0.1:6379> BITCOUNT first      # 0000 1011
(integer) 3

127.0.0.1:6379> SETBIT x 3 1        
(integer) 0
127.0.0.1:6379> SETBIT x 1 1        
(integer) 0
127.0.0.1:6379> SETBIT x 0 1        # 0000 1011
(integer) 0
127.0.0.1:6379> SETBIT y 2 1        
(integer) 0
127.0.0.1:6379> SETBIT y 1 1        # 0000 0110
(integer) 0
127.0.0.1:6379> SETBIT z 2 1        
(integer) 0
127.0.0.1:6379> SETBIT z 0 1        # 0000 0101
(integer) 0

127.0.0.1:6379> BITOP AND andRes x y z    #0000 0000
(integer) 1
127.0.0.1:6379> BITOP OR orRes x y z      #0000 1111
(integer) 1
127.0.0.1:6379> BITOP XOR x y z           #0000 1000
(integer) 1

# 对给定的位数组进行按位取反
127.0.0.1:6379> SETBIT value 0 1
(integer) 0
127.0.0.1:6379> SETBIT value 3 1            #0000 1001
(integer) 0
127.0.0.1:6379> BITOP NOT notValue value    #1111 0110
(integer) 1

3.BitMap源码分析

3.1 数据结构

如下展示了一个用 SDS 表示的一字节(8位)长的位图:

扩展:Redis 中的每个对象都是有一个 redisObject 结构表示的。

typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
// 引用计数
int refcount;
// 执行底层实现的数据结构的指针
void *ptr;
} robj;
  • type 的值为 REDIS_STRING表示这是一个字符串对象
  • sdshdr.len 的值为1表示这个SDS保存了一个1字节大小的位数组
  • buf数组中的buf[0]实际保存了位数组
  • buf数组中的buf[1]为自动追加的

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer