Dieser Artikel bringt Ihnen relevantes Wissen über Redis, das uns hauptsächlich die Bitmap-Datenstruktur vorstellt. Die Bitmap-Datenstruktur ist eigentlich keine brandneue Sache. Der darin enthaltene Inhalt kann jedoch nur 0 oder 1 sein. Ich hoffe, dass es für alle hilfreich ist.
Empfohlenes Lernen: Redis-Video-Tutorial
Wenn wir aufzeichnen müssen, ob sich ein Benutzer ein Jahr lang jeden Tag bei unserem System anmeldet, wie sollten wir diese Anforderung erfüllen? Wenn KV-Speicher verwendet wird, muss jeder Benutzer 365 Datensätze aufzeichnen. Wenn die Anzahl der Benutzer Hunderte Millionen erreicht, ist der erforderliche Speicherplatz enorm.
Redis stellt uns die Bitmap-Datenstruktur für 365 Tage zur Verfügung. Es sind nur 46 Bytes zum Speichern erforderlich.
Die Bitmap-Datenstruktur ist eigentlich keine ganz neue Sache. Wir können sie uns einfach als Array vorstellen, aber der Inhalt darin kann nur 0 oder 1 sein (binäres Bit-Array).
Redis bietet vier allgemeine SETBIT
, GETBIT
, BITCOUNT
und BITOP
Befehle werden zur Verarbeitung binärer Bit-Arrays verwendet. 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]
为自动追加的
Das obige ist der detaillierte Inhalt vonVerstehen Sie die Bitmap von Redis in einem Artikel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!