Jak název napovídá, SETBIT
umožňuje provádět bitové operace – jmenovitě nastavit daný bit na 0 nebo 1 s daným bitovým offsetem pro daný klíč.
Důležité je pochopit, že výsledek ne vždy obsahuje pouze tisknutelné znaky. To je důvod, proč Redis používá vlastní funkci sdscatrepr
pro formátování výstupu CLI:
Připojte k řetězci sds "s" reprezentaci řetězce s escapováním, kde jsou všechny netisknutelné znaky (testováno pomocí isprint()) převedeny na escape ve tvaru "\n\r\a...." nebo "\x" .
Jak již bylo řečeno, začněme jednoduchým příkladem. Pokud vezmete v úvahu hexadecimální číslo 0x7F
(=127) jeho binární reprezentace na 8 bitech je:
pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
^ ^
| |
MSB LSB
Obvykle můžete použít SETBIT
pro uložení této hodnoty, přičemž mějte na paměti offset 0
je MSB
a offset 7 je 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
Získejte svou hodnotu ke kontrole, pokud:
redis> GET myval
"\x7f"
Co se teď stane s více bajty? Řekněme, že chcete uložit 0x52
(=82), což odpovídá znaku R
v ASCII. 8bitová reprezentace je 01010010
s bitovými pozicemi (8, 9, ..., 15)
protože chceme, aby byla uložena hned za první hodnotou:
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
A dostanete:
redis> GET myval
"\x7fR"
Zde Redis CLI dokáže reprezentovat tisknutelný znak R
.
Když uložím hodnotu řetězce 1 a 7 do "mykey"
Odpovídá 01000001
což se rovná 65 a 0x41
v hex. Odpovídá ASCII znaku A
. Tak dělám:
redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0
Dává:
redis> GET mykey
"A"
jak getbit funguje uvnitř redis?
Jednoduše vrátí hodnotu bitu na dané pozici. Zde:
redis> GETBIT mykey 1
(integer) 1
Ale bit 0 nebyl nastaven (ve výchozím nastavení je 0), takže:
redis> GETBIT mykey 0
(integer) 0