Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Alguém pode explicar o comando redis setbit?


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