Como o próprio nome indica,
SETBIT
permite que você execute operações de bit - ou seja, defina um determinado bit para 0 ou 1, em um determinado deslocamento de bit, para uma determinada chave. O que é importante entender é que o resultado nem sempre inclui apenas caracteres imprimíveis. É por isso que o Redis usa uma função personalizada
sdscatrepr
para formatar a saída da CLI:
Acrescente à string sds "s" uma representação de string de escape onde todos os caracteres não imprimíveis (testados com isprint()) são transformados em escapes no formato "\n\r\a...." ou "\x" .
Dito isto, vamos começar com um exemplo simples. Se você considerar o número hexadecimal
0x7F
(=127) sua representação binária em 8 bits é:pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
^ ^
| |
MSB LSB
Você normalmente pode usar
SETBIT
para armazenar esse valor, lembrando que o deslocamento 0
é MSB
e o deslocamento 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
Obtenha seu valor para inspecionar se:
redis> GET myval
"\x7f"
Agora o que acontece com multi bytes? Digamos que você queira armazenar
0x52
(=82) que corresponde ao caractere R
em ASCII. A representação de 8 bits é 01010010
com posições de bit (8, 9, ..., 15)
já que queremos que ele seja armazenado logo após o primeiro valor: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 você obtém:
redis> GET myval
"\x7fR"
Aqui o Redis CLI é capaz de representar o caractere imprimível
R
.
Quando eu armazeno o valor da string 1 e 7 em "mykey"
Corresponde a
01000001
que é igual a 65 e 0x41
em hex. Corresponde ao caractere ASCII A
. Assim fazendo:redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0
Dá:
redis> GET mykey
"A"
como o getbit funciona dentro do redis?
Ele simplesmente retorna o valor do bit na posição dada. Aqui:
redis> GETBIT mykey 1
(integer) 1
Mas o bit 0 não foi definido (é 0 por padrão) assim:
redis> GETBIT mykey 0
(integer) 0