Som navnet antyder, SETBIT
giver dig mulighed for at udføre bitoperationer - nemlig indstille en given bit til 0 eller 1, ved en given bitforskydning, for en given nøgle.
Det, der er vigtigt at forstå, er, at resultatet ikke altid kun indeholder tegn, der kan udskrives. Det er derfor Redis bruger en brugerdefineret funktion sdscatrepr
for at formatere CLI-outputtet:
Føj til sds-strengen "s" en escaped strengrepræsentation, hvor alle de ikke-udskrivbare tegn (testet med isprint()) omdannes til escapes i formen "\n\r\a..." eller "\x" .
Når det er sagt, lad os starte med et simpelt eksempel. Hvis du overvejer hex-nummeret 0x7F
(=127) dens binære repræsentation på 8-bit er:
pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
^ ^
| |
MSB LSB
Du kan typisk bruge SETBIT
for at gemme denne værdi, og husk at offset 0
er MSB
og offset 7 er 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
Få din værdi til at inspicere, hvis:
redis> GET myval
"\x7f"
Hvad sker der nu med multibytes? Lad os sige, at du vil gemme 0x52
(=82), hvilket svarer til tegnet R
i ASCII. 8-bit repræsentationen er 01010010
med bitpositioner (8, 9, ..., 15)
da vi vil have den gemt lige efter den første værdi:
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
Og du får:
redis> GET myval
"\x7fR"
Her er Redis CLI i stand til at repræsentere det printbare tegn R
.
Når jeg gemmer strengværdi 1 og 7 i "mykey"
Det svarer til 01000001
som er lig med 65 og 0x41
i hex. Det svarer til ASCII-tegn A
. Så gør:
redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0
Giver:
redis> GET mykey
"A"
hvordan fungerer getbit inde i redis?
Det returnerer blot værdien af bit ved den givne position. Her:
redis> GETBIT mykey 1
(integer) 1
Men bit 0 er ikke blevet sat (det er 0 som standard) således:
redis> GETBIT mykey 0
(integer) 0