sql >> Database >  >> NoSQL >> Redis

Kan iemand het redis setbit-commando uitleggen?

Zoals de naam al aangeeft, SETBIT stelt u in staat bitbewerkingen uit te voeren - namelijk een gegeven bit instellen op 0 of 1, bij een bepaalde bitverschuiving, voor een bepaalde sleutel.

Wat belangrijk is om te begrijpen, is dat het resultaat niet altijd alleen afdrukbare tekens bevat. Daarom gebruikt Redis een aangepaste functie sdscatrepr om de CLI-uitvoer te formatteren:

Voeg aan de sds-tekenreeks "s" een escape-tekenreeks toe waarin alle niet-afdrukbare tekens (getest met isprint()) worden omgezet in escapes in de vorm "\n\r\a..." of "\x" .

Dat gezegd hebbende, laten we beginnen met een eenvoudig voorbeeld. Als u rekening houdt met het hexadecimale getal 0x7F (=127) zijn binaire weergave op 8-bit is:

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

U kunt meestal SETBIT . gebruiken om deze waarde op te slaan, houd er rekening mee dat offset 0 is MSB en offset 7 is 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

Het krijgt uw waarde om te inspecteren als:

redis> GET myval
"\x7f"

Wat gebeurt er nu met meerdere bytes? Stel dat u 0x52 . wilt opslaan (=82) wat overeenkomt met teken R in ASCII. De 8-bits weergave is 01010010 met bitposities (8, 9, ..., 15) omdat we willen dat het direct na de eerste waarde wordt opgeslagen:

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

En je krijgt:

redis> GET myval
"\x7fR"

Hier kan Redis CLI het afdrukbare teken R weergeven .

Wanneer ik tekenreekswaarde 1 en 7 opsla in "mijnsleutel"

Het komt overeen met 01000001 wat gelijk is aan 65 en 0x41 in zeshoek. Het komt overeen met ASCII-teken A . Zo doende:

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

Geeft:

redis> GET mykey
"A"

hoe werkt de getbit in redis?

Het retourneert eenvoudig de waarde van het bit op de gegeven positie. Hier:

redis> GETBIT mykey 1
(integer) 1

Maar bit 0 is niet ingesteld (het is standaard 0), dus:

redis> GETBIT mykey 0
(integer) 0


  1. MongoDB-geheugengebruik bijhouden

  2. Mangoest:schema versus model?

  3. Kan geen index maken in mongodb, sleutel te groot om te indexeren

  4. MongoDB - is DBREF nodig?