sql >> Databáze >  >> NoSQL >> Redis

Může někdo vysvětlit příkaz redis setbit?

Jak název napovídá, SETBIT umožňuje provádět bitové operace – jmenovitě nastavit daný bit na 0 nebo 1 s daným bitovým offsetem pro daný klíč.

Důležité je pochopit, že výsledek ne vždy obsahuje pouze tisknutelné znaky. To je důvod, proč Redis používá vlastní funkci sdscatrepr pro formátování výstupu CLI:

Připojte k řetězci sds "s" reprezentaci řetězce s escapováním, kde jsou všechny netisknutelné znaky (testováno pomocí isprint()) převedeny na escape ve tvaru "\n\r\a...." nebo "\x" .

Jak již bylo řečeno, začněme jednoduchým příkladem. Pokud vezmete v úvahu hexadecimální číslo 0x7F (=127) jeho binární reprezentace na 8 bitech je:

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

Obvykle můžete použít SETBIT pro uložení této hodnoty, přičemž mějte na paměti offset 0 je MSB a offset 7 je 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

Získejte svou hodnotu ke kontrole, pokud:

redis> GET myval
"\x7f"

Co se teď stane s více bajty? Řekněme, že chcete uložit 0x52 (=82), což odpovídá znaku R v ASCII. 8bitová reprezentace je 01010010 s bitovými pozicemi (8, 9, ..., 15) protože chceme, aby byla uložena hned za první hodnotou:

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

A dostanete:

redis> GET myval
"\x7fR"

Zde Redis CLI dokáže reprezentovat tisknutelný znak R .

Když uložím hodnotu řetězce 1 a 7 do "mykey"

Odpovídá 01000001 což se rovná 65 a 0x41 v hex. Odpovídá ASCII znaku A . Tak dělám:

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

Dává:

redis> GET mykey
"A"

jak getbit funguje uvnitř redis?

Jednoduše vrátí hodnotu bitu na dané pozici. Zde:

redis> GETBIT mykey 1
(integer) 1

Ale bit 0 nebyl nastaven (ve výchozím nastavení je 0), takže:

redis> GETBIT mykey 0
(integer) 0


  1. 5 způsobů, jak získat milisekundy z data v MongoDB

  2. Zdá se, že výsledky MapReduce jsou omezeny na 100?

  3. Můžete zadat klíč pro $addToSet v Mongo?

  4. Efektivní stránkování v MongoDB pomocí mgo