[Redis] Das Prinzip und die Verwendung von Bitmaps in Redis

1. Prinzip

Zuerst deklarieren: Redis hat 5 Datentypen, und BitMap ist kein neuer Datentyp in Redis, seine unterste Ebene ist die Redis-Implementierung.

Normalerweise speichern wir in Redis eine Zeichenfolge, z. B. „big“, und ihre Bitmap lautet wie folgt:
Fügen Sie hier eine Bildbeschreibung ein

0,001 kb = 1b = 8bit

Daher belegt die Zeichenfolge „big“ 3 Zeichen, also 24 Bit.

Redis hat seit Version 2.2.0 mehrere Bitmap-bezogene Befehle wie setbit, getbit und bitcount hinzugefügt. Obwohl es sich um einen neuen Befehl handelt, wird kein neuer Datentyp hinzugefügt, da Befehle wie „setbit“ lediglich Erweiterungen für „set“ sind.

Mit den oben genannten Befehlen kann Redis Binärbits manipulieren und den jedem Bit entsprechenden Wert abrufen/ändern. Schreiben Sie einfach ein paar:

127.0.0.1:6379 > set hello big
"OK"
 
127.0.0.1:6379 > getbit hello 0
"0"
 
127.0.0.1:6379 > getbit hello 1
"1"
 
127.0.0.1:6379 > setbit hello 7 1
"0"
 
127.0.0.1:6379 > get hello
"cig"

Anhand des obigen Beispiels können wir Folgendes herausfinden:

  • getbit und setbit können Bitoperationen an Zeichenfolgen ausführen und den Wert eines bestimmten Bits abrufen/ändern.
  • Nachdem die Bits der Zeichenfolge geändert wurden, ändert sich die Zeichenfolge selbst grundlegend: big -> cig.

Die ursprüngliche Bedeutung von BitMap besteht darin, ein Bit zu verwenden, um 0 oder 1 zu setzen, um den Zustand eines Elements abzubilden.

Da ein Bit nur die beiden Zustände 0 und 1 darstellen kann, dh die maximale Informationsmenge, die ein Bit speichern kann, 2 beträgt, sind die Zustände, die BitMap abbilden kann, begrenzt, aber der Vorteil der Verwendung von Bits besteht darin, dass dies der Fall ist kann viel Speicherplatz sparen.

2. BitMap-bezogene Befehle

In Redis ist Bitmap eine Reihe kontinuierlicher Binärzahlen (0 oder 1). Daher kann man sich Bitmaps als Array in Bits vorstellen, und die Position jedes Bits im Array ist Offset (Offset), der Index des Arrays wird aufgerufen der Offset in Bitmaps, und AND, OR, XOR und andere Bitoperationen können an der Bitmap durchgeführt werden.

# 设置值,其中value只能是 0 和 1
setbit key offset value
 
# 获取值
getbit key offset
 
# 获取指定范围内值为 1 的个数
# start 和 end 以字节为单位
bitcount key start end
 
# BitMap间的运算
# operations 位移操作符,枚举值
  AND 与运算 &
  OR 或运算 |
  XOR 异或 ^
  NOT 取反 ~
# result 计算的结果,会存储在该key中
# key1 … keyn 参与运算的key,可以有多个,空格分割,not运算只能一个key
# 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0。返回值是保存到 destkey 的字符串的长度(以字节byte为单位),和输入 key 中最长的字符串长度相等。
bitop [operations] [result] [key1] [keyn…]
 
# 返回指定key中第一次出现指定value(0/1)的位置
bitpos [key] [value]

3. BitMap-Speicherplatzberechnung

Da es sich bei Bits in BitMap um eine Zuordnung von Zeichenfolgen handelt, gibt es für die Speicherung von Zeichenfolgen im Wert eine Obergrenze, sodass der Wertspeicherplatz von BitMap auf die gleiche Weise berechnet werden kann.

Die maximale Länge einer Zeichenfolge in Redis beträgt 512 MB, daher beträgt der maximale Offset (Offset) von BitMap:

512 * 1024 * 1024 * 8  =  2^32

4. Nutzungsszenarien

1. Benutzeranmeldung

Viele Websites bieten eine Check-in-Funktion und müssen den Check-in-Status des letzten Monats anzeigen, was mit BitMap erreicht werden kann.
Gemäß Datumsoffset = (Tag des heutigen Jahres) % (Tag des Jahres), Schlüssel = Jahr: Benutzer-ID.

Wenn Sie die detaillierten Check-in-Informationen des Benutzers in der Datenbank speichern müssen, können Sie die Verwendung eines einstufigen Threads zur Vervollständigung in Betracht ziehen.

# 2021年第一天,用户Id = userId 的用户签到
setbit 2021:userId 1 1

2. Statistik der aktiven Benutzer (Benutzer-Login-Status)

Verwenden Sie das Datum als Schlüssel, dann die Benutzer-ID als Offset und setzen Sie es auf 1, wenn es an diesem Tag aktiv ist. Sie können den Standard festlegen, nach dem Sie aktiv sein möchten.

Wenn:

  • 20220101 Aktive Benutzer sind: [1, 0, 1, 1, 0]
  • 20220102 Aktive Benutzer sind: [ 1, 1, 0, 1, 0 ]

Zählen Sie die Gesamtzahl der aktiven Benutzer an zwei aufeinanderfolgenden Tagen:

bitop and dest1 20220101 20220102 
# dest1 中值为1的offset,就是连续两天活跃用户的ID
bitcount dest1

Zählen Sie die Gesamtzahl der aktiven Benutzer von 20220101 bis 20220102:

bitop or dest2 20220101 20220102
# dest2 中值为1的offset,就是两天都活跃的用户的ID
bitcount dest2

3. Statistischer Online-Status des Benutzers

Wenn Sie eine Schnittstelle bereitstellen müssen, um abzufragen, ob der aktuelle Benutzer online ist, können Sie auch die Verwendung von BitMap in Betracht ziehen, was Platz spart und sehr effizient ist. Es ist nur ein Schlüssel erforderlich und die Benutzer-ID wird versetzt. Wenn er online ist, ist er es ist auf 1 gesetzt, und wenn es nicht online ist, wird es auf 0 gesetzt.

# userId 登录,设置状态为1
setbit key userId 1
 
# 获取 userId 的状态:1 - 在线;0 - 不在线
getbit key userId

4. Implementieren Sie den Bloom-Filter

Bloom-Filter lösen die Cache-Penetration.

Weitere Informationen zu Bloom-Filtern finden Sie in meinem Artikel: Bloom-Filter

V. Zusammenfassung

  1. Bigmap wird auf der Grundlage der kleinsten Biteinheit gespeichert. Der größte Vorteil besteht darin, dass Platz gespart wird.
  2. Die zeitliche Komplexität des Einstellens beträgt O (1) und die zeitliche Komplexität des Lesens beträgt O (n). Die Operation ist sehr schnell;
  3. Die Speicherung binärer Daten ist bei entsprechenden Berechnungen sehr schnell und kann auch problemlos erweitert werden;
  4. Legen Sie für eine sehr kurze Bigmap keinen sehr langen Offset-Wert fest, da dies zu Blockaden führen kann.

Guess you like

Origin blog.csdn.net/u011397981/article/details/130693847