sql >> Base de Datos >  >> NoSQL >> Redis

¿Alguien puede explicar el comando redis setbit?

Como su nombre lo indica, SETBIT le permite realizar operaciones de bits, es decir, establecer un bit dado en 0 o 1, en un desplazamiento de bit dado, para una tecla dada.

Lo que es importante entender es que el resultado no siempre incluye solo caracteres imprimibles. Esta es la razón por la que Redis usa una función personalizada sdscatrepr para formatear la salida CLI:

Agregue a la cadena sds "s" una representación de cadena escapada donde todos los caracteres no imprimibles (probados con isprint()) se convierten en escapes en la forma "\n\r\a...." o "\x" .

Dicho esto, comencemos con un ejemplo simple. Si considera el número hexadecimal 0x7F (=127) su representación binaria en 8 bits es:

pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
     ^             ^
     |             |
     MSB           LSB

Por lo general, puede usar SETBIT para almacenar este valor, teniendo en cuenta que el desplazamiento 0 es MSB y el desplazamiento 7 es 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

Obtenga su valor para inspeccionar si:

redis> GET myval
"\x7f"

Ahora, ¿qué sucede con los bytes múltiples? Digamos que desea almacenar 0x52 (=82) que corresponde al carácter R en ASCII. La representación de 8 bits es 01010010 con posiciones de bit (8, 9, ..., 15) ya que queremos que se almacene justo después del primer 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

Y obtienes:

redis> GET myval
"\x7fR"

Aquí Redis CLI puede representar el carácter imprimible R .

Cuando almaceno los valores de cadena 1 y 7 en "mykey"

Corresponde a 01000001 que es igual a 65 y 0x41 en hexadecimal Corresponde al carácter ASCII A . Haciendo lo mismo:

redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0

Da:

redis> GET mykey
"A"

¿Cómo funciona getbit dentro de redis?

Simplemente devuelve el valor del bit en la posición dada. Aquí:

redis> GETBIT mykey 1
(integer) 1

Pero el bit 0 no se ha establecido (es 0 por defecto), por lo tanto:

redis> GETBIT mykey 0
(integer) 0