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