Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Kann jemand den Befehl redis setbit erklären?

Wie der Name schon sagt, SETBIT ermöglicht es Ihnen, Bit-Operationen durchzuführen – nämlich ein bestimmtes Bit auf 0 oder 1 zu setzen, bei einem bestimmten Bit-Offset, für einen bestimmten Schlüssel.

Es ist wichtig zu verstehen, dass das Ergebnis nicht immer nur druckbare Zeichen enthält. Aus diesem Grund verwendet Redis eine benutzerdefinierte Funktion sdscatrepr um die CLI-Ausgabe zu formatieren:

Hängen Sie an die sds-Zeichenfolge „s“ eine Escapezeichenkettendarstellung an, bei der alle nicht druckbaren Zeichen (getestet mit isprint()) in Escapezeichen in der Form „\n\r\a....“ oder „\x“ umgewandelt werden. .

Davon abgesehen beginnen wir mit einem einfachen Beispiel. Betrachtet man die Hex-Zahl 0x7F (=127) seine binäre Darstellung auf 8-Bit ist:

pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
     ^             ^
     |             |
     MSB           LSB

Sie können normalerweise SETBIT verwenden um diesen Wert zu speichern, wobei der Offset 0 zu beachten ist ist MSB und Offset 7 ist LSB :

redis> SETBIT myval 0 0
(integer) 0
redis> SETBIT myval 1 1
(integer) 0
redis> SETBIT myval 2 1
(integer) 0
redis> SETBIT myval 3 1
(integer) 0
redis> SETBIT myval 4 1
(integer) 0
redis> SETBIT myval 5 1
(integer) 0
redis> SETBIT myval 6 1
(integer) 0
redis> SETBIT myval 7 1
(integer) 0

Sie können Ihren Wert überprüfen, wenn:

redis> GET myval
"\x7f"

Was passiert nun mit Multibytes? Angenommen, Sie möchten 0x52 speichern (=82), was dem Zeichen R entspricht im ASCII-Format. Die 8-Bit-Darstellung ist 01010010 mit Bitpositionen (8, 9, ..., 15) da wir möchten, dass es direkt nach dem ersten Wert gespeichert wird:

redis> SETBIT myval 8 0
(integer) 0
redis> SETBIT myval 9 1
(integer) 0
redis> SETBIT myval 10 0
(integer) 0
redis> SETBIT myval 11 1
(integer) 0
redis> SETBIT myval 12 0
(integer) 0
redis> SETBIT myval 13 0
(integer) 0
redis> SETBIT myval 14 1
(integer) 0
redis> SETBIT myval 15 0
(integer) 0

Und Sie erhalten:

redis> GET myval
"\x7fR"

Hier kann Redis CLI das druckbare Zeichen R darstellen .

Wenn ich die Zeichenfolgenwerte 1 und 7 in "mykey" speichere

Es entspricht 01000001 was gleich 65 und 0x41 ist in hex. Es entspricht dem ASCII-Zeichen A . Dabei:

redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0

Gibt:

redis> GET mykey
"A"

wie funktioniert das getbit in redis?

Es gibt einfach den Wert des Bits an der angegebenen Position zurück. Hier:

redis> GETBIT mykey 1
(integer) 1

Aber Bit 0 wurde nicht gesetzt (es ist standardmäßig 0), also:

redis> GETBIT mykey 0
(integer) 0