Redis
 sql >> база данни >  >> NoSQL >> Redis

Как мога да преобразувам байтове в цял шестнадесетичен низ?

При итерация над bytes стойност, получавате цели числа; те са тривиално преобразувани в шестнадесетична нотация:

def convert(value: bytes):
    return ''.join([f'\\x{b:02x}' for b in value])

Имайте предвид, че това създава низ с буквални обратни наклонени черти, x знаци и шестнадесетични цифри . Вече не е bytes стойност.

Демо:

>>> print(convert(b'\x01\x02\x41'))
\x01\x02\x41

Само за да сте сигурни, не е нужно да се притеснявате за bytes стойност . repr() представяне на bytes обектът винаги ще използва ASCII символи, когато стойността на байта е тази на ASCII кодова точка за печат. Това не означава, че стойността е променена. b'\x01\x02\x41' е равно на b'\x01\x02A' . Протоколът Redis не знае нищо за \x<HH> escape последователности, така че не се опитвайте да изпращате горния низ по кабела.

Escape-последователностите, които създавате, са последователности от низове на bash shell , и точно като низовете на Python, не е нужно да използвате escapes . Както в Python, за Bash на низовете "\x01\x02A" и "\x01\x02\x41" имат равни стойности. Те имат смисъл само когато предавате низове с ключ и стойност в командния ред, а не в текстов файл, който изпращате към redis-cli .

Освен това, моля, имайте предвид, че redis-cli --pipe командата приема необработено въвеждане на Redis протокол , а не синтаксис на командата Redis, вижте Масово вмъкване на Redis документация. Този протокол не използвайте \xhh последователности, тъй като не използва нотация на обвивката.

Вместо това използвайте следната функция, за да генерирате необработен SET команди:

def raw_protocol(cmd: str, *args: bytes):
    return b'\r\n'.join([
        f'*{len(args) + 1}\r\n${len(cmd)}\r\n{cmd}'.encode(),
        *(bv for a in args for bv in (b'$%d' % len(a), a)),
        b''
    ])

За SET команда, използвайте raw_protocol('SET', keybytes, valuebytes) и запишете получените от това двоични данни във файл, отворен в двоичен режим.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis AOF fsync (ВИНАГИ) срещу LSM дърво

  2. redis dump.rdb / запазване на малки файлове

  3. Проектиране на приложение с Redis като хранилище на данни. Какво? Защо?

  4. Времева сложност на zadd, когато стойността има резултат, по-висок от най-високия резултат, присъстващ в целевия сортиран набор

  5. Как работи PubSub в BookSleeve/ Redis?