Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Czy ktoś może wyjaśnić polecenie redis setbit?

Jak sama nazwa wskazuje, SETBIT pozwala na wykonywanie operacji na bitach - mianowicie ustawienie danego bitu na 0 lub 1, przy danym przesunięciu bitu, dla danego klawisza.

Ważne jest, aby zrozumieć, że wynik nie zawsze zawiera tylko znaki, które można wydrukować. Dlatego Redis używa niestandardowej funkcji sdscatrepr aby sformatować wyjście CLI:

Dołącz do ciągu sds „s” ciąg znaków ze znakami ucieczki, w którym wszystkie niedrukowalne znaki (testowane za pomocą isprint()) są zamieniane na znaki specjalne w postaci „\n\r\a...” lub „\x” .

Biorąc to pod uwagę, zacznijmy od prostego przykładu. Jeśli weźmiesz pod uwagę liczbę szesnastkową 0x7F (=127) jego binarna reprezentacja na 8-bitach to:

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

Zazwyczaj możesz użyć SETBIT aby zapisać tę wartość, pamiętając, że przesunięcie 0 to MSB a offset 7 to 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

Sprawdź swoją wartość, jeśli:

redis> GET myval
"\x7f"

Co się dzieje z wieloma bajtami? Załóżmy, że chcesz przechowywać 0x52 (=82), co odpowiada znakowi R w ASCII. Reprezentacja 8-bitowa to 01010010 z pozycjami bitów (8, 9, ..., 15) ponieważ chcemy, aby była przechowywana zaraz po pierwszej wartości:

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

I otrzymujesz:

redis> GET myval
"\x7fR"

Tutaj Redis CLI może reprezentować drukowalny znak R .

Kiedy zapisuję ciąg wartości 1 i 7 w „mykey”

Odpowiada 01000001 co jest równe 65 i 0x41 w szesnastkach. Odpowiada znakowi ASCII A . Robię to:

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

Daje:

redis> GET mykey
"A"

jak działa getbit w redis?

Po prostu zwraca wartość bitu w danej pozycji. Tutaj:

redis> GETBIT mykey 1
(integer) 1

Ale bit 0 nie został ustawiony (domyślnie jest to 0), więc:

redis> GETBIT mykey 0
(integer) 0


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak uruchomić serwer Redis ORAZ inną aplikację w Dockerze?

  2. Jaki jest maksymalny rozmiar wartości, który możesz przechowywać w redis?

  3. Alternatywa dla servicestack.redis

  4. Jak przekonwertować istniejącą relacyjną bazę danych na magazyn klucz-wartość?

  5. Napisz na Slave redis db