Come suggerisce il nome, SETBIT
consente di eseguire operazioni sui bit, vale a dire impostare un determinato bit su 0 o 1, a un determinato offset di bit, per una determinata chiave.
Ciò che è importante capire è che il risultato non include sempre solo caratteri stampabili. Questo è il motivo per cui Redis utilizza una funzione personalizzata sdscatrepr
per formattare l'output della CLI:
Aggiungi alla stringa sds "s" una rappresentazione di stringa di escape in cui tutti i caratteri non stampabili (testati con isprint()) vengono trasformati in escape nella forma "\n\r\a...." o "\x" .
Detto questo, iniziamo con un semplice esempio. Se consideri il numero esadecimale 0x7F
(=127) la sua rappresentazione binaria su 8 bit è:
pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
^ ^
| |
MSB LSB
In genere puoi usare SETBIT
per memorizzare questo valore, tenendo presente che offset 0
è MSB
e l'offset 7 è 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
Ottieni il tuo valore da ispezionare se:
redis> GET myval
"\x7f"
Ora cosa succede con più byte? Supponiamo che tu voglia memorizzare 0x52
(=82) che corrisponde al carattere R
in ASCII. La rappresentazione a 8 bit è 01010010
con posizioni di bit (8, 9, ..., 15)
poiché vogliamo che venga memorizzato subito dopo il primo valore:
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
E ottieni:
redis> GET myval
"\x7fR"
Qui Redis CLI è in grado di rappresentare il carattere stampabile R
.
Quando memorizzo il valore della stringa 1 e 7 in "mykey"
Corrisponde a 01000001
che è uguale a 65 e 0x41
in esadecimale. Corrisponde al carattere ASCII A
. Così facendo:
redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0
Dà:
redis> GET mykey
"A"
come funziona getbit all'interno di redis?
Restituisce semplicemente il valore del bit nella posizione data. Qui:
redis> GETBIT mykey 1
(integer) 1
Ma il bit 0 non è stato impostato (è 0 per impostazione predefinita) quindi:
redis> GETBIT mykey 0
(integer) 0