Maison >base de données >Redis >Comprendre le bitmap de Redis dans un article
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.
Apprentissage recommandé : Tutoriel vidéo Redis
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).
Redis fournit quatre SETBIT
, GETBIT
, BITCOUNT
et BITOP
commun. les commandes sont utilisées pour traiter des tableaux de bits binaires. SETBIT
、GETBIT
、BITCOUNT
、BITOP
四个常用命令用于处理二进制位数组。
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
如下展示了一个用 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[0]
实际保存了位数组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!