sql >> Databasteknik >  >> NoSQL >> Redis

Kan någon förklara redis setbit-kommando?

Som namnet antyder, SETBIT låter dig utföra bitoperationer - nämligen ställa in en given bit till 0 eller 1, vid en given bitoffset, för en given nyckel.

Det som är viktigt att förstå är att resultatet inte alltid innehåller endast utskrivbara tecken. Det är därför Redis använder en anpassad funktion sdscatrepr för att formatera CLI-utgången:

Lägg till sds-strängen "s" en escaped strängrepresentation där alla icke-utskrivbara tecken (testade med isprint()) omvandlas till escapes i formen "\n\r\a..." eller "\x" .

Med det sagt, låt oss börja med ett enkelt exempel. Om du tar hänsyn till hex-numret 0x7F (=127) dess binära representation på 8-bitar är:

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

Du kan vanligtvis använda SETBIT för att lagra detta värde, med tanke på offset 0 är MSB och offset 7 är 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

Få ditt värde att inspektera om:

redis> GET myval
"\x7f"

Vad händer nu med flera bytes? Låt oss säga att du vill lagra 0x52 (=82) vilket motsvarar tecknet R i ASCII. 8-bitars representationen är 01010010 med bitpositioner (8, 9, ..., 15) eftersom vi vill att det ska lagras direkt efter det första värdet:

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

Och du får:

redis> GET myval
"\x7fR"

Här kan Redis CLI representera det utskrivbara tecknet R .

När jag lagrar strängvärdena 1 och 7 i "mykey"

Det motsvarar 01000001 som är lika med 65 och 0x41 i hex. Det motsvarar ASCII-tecknet A . Så gör:

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

Ger:

redis> GET mykey
"A"

hur fungerar getbit inuti redis?

Den returnerar helt enkelt värdet på biten vid den givna positionen. Här:

redis> GETBIT mykey 1
(integer) 1

Men bit 0 har inte ställts in (den är 0 som standard) alltså:

redis> GETBIT mykey 0
(integer) 0


  1. Rörliga medelvärden med MongoDB:s aggregeringsramverk?

  2. vill köra redis-server i bakgrunden nonstop

  3. Redis Managed Pub/Sub Server

  4. Spring Data MongoDB - Annotation @CreatedDate fungerar inte när du använder med anpassat Id-fält