Comme son nom l'indique, SETBIT
vous permet d'effectuer des opérations sur les bits - à savoir définir un bit donné sur 0 ou 1, à un décalage de bit donné, pour une clé donnée.
Ce qu'il est important de comprendre, c'est que le résultat ne comprend pas toujours uniquement des caractères imprimables. C'est pourquoi Redis utilise une fonction personnalisée sdscatrepr
pour formater la sortie CLI :
Ajoutez à la chaîne sds "s" une représentation sous forme de chaîne échappée où tous les caractères non imprimables (testés avec isprint()) sont transformés en échappements sous la forme "\n\r\a...." ou "\x" .
Cela étant dit, commençons par un exemple simple. Si vous considérez le nombre hexadécimal 0x7F
(=127) sa représentation binaire sur 8 bits est :
pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
^ ^
| |
MSB LSB
Vous pouvez généralement utiliser SETBIT
pour stocker cette valeur, en gardant à l'esprit que le décalage 0
est MSB
et le décalage 7 est 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
Obtenez votre valeur à inspecter si :
redis> GET myval
"\x7f"
Que se passe-t-il maintenant avec les multi-octets ? Disons que vous voulez stocker 0x52
(=82) qui correspond au caractère R
en ASCII. La représentation 8 bits est 01010010
avec des positions de bit (8, 9, ..., 15)
puisque nous voulons qu'il soit stocké juste après la première valeur :
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
Et vous obtenez :
redis> GET myval
"\x7fR"
Ici Redis CLI est capable de représenter le caractère imprimable R
.
Lorsque je stocke les valeurs de chaîne 1 et 7 dans "mykey"
Il correspond à 01000001
qui est égal à 65 et 0x41
en hexagone. Il correspond au caractère ASCII A
. Ainsi faisant :
redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0
Donne :
redis> GET mykey
"A"
comment fonctionne getbit dans redis ?
Il renvoie simplement la valeur du bit à la position donnée. Ici :
redis> GETBIT mykey 1
(integer) 1
Mais le bit 0 n'a pas été positionné (c'est 0 par défaut) donc :
redis> GETBIT mykey 0
(integer) 0