Redis
 sql >> Database >  >> NoSQL >> Redis

Qualcuno può spiegare il comando redis setbit?

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