Както подсказва името му, SETBIT
ви позволява да извършвате битови операции – а именно да зададете даден бит на 0 или 1, при дадено битово изместване, за даден ключ.
Важно е да се разбере, че резултатът не винаги включва само печатни знаци. Ето защо Redis използва персонализирана функция sdscatrepr
за да форматирате изхода на CLI:
Добавете към sds низа "s" представяне на екранизиран низ, където всички непечатаеми знаци (тествани с isprint()) се превръщат в escape под формата "\n\r\a..." или "\x" .
Като се има предвид това, нека започнем с прост пример. Ако вземете предвид шестнадесетичния номер 0x7F
(=127) неговото двоично представяне на 8-битов е:
pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
^ ^
| |
MSB LSB
Обикновено можете да използвате SETBIT
за да съхраните тази стойност, като имате предвид, че отместването 0
е MSB
и отместване 7 е 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
Вземете стойността си, за да проверите, ако:
redis> GET myval
"\x7f"
Сега какво се случва с много байтове? Да приемем, че искате да съхраните 0x52
(=82), което съответства на знак R
в ASCII. 8-битовото представяне е 01010010
с битови позиции (8, 9, ..., 15)
тъй като искаме да се съхранява веднага след първата стойност:
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
И получавате:
redis> GET myval
"\x7fR"
Тук Redis CLI може да представи символа за печат R
.
Когато съхранявам стойности на низове 1 и 7 в "mykey"
Отговаря на 01000001
което е равно на 65 и 0x41
в шестнадесетичен. Той съответства на ASCII символ A
. Така се прави:
redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0
Дава:
redis> GET mykey
"A"
как getbit работи в redis?
Той просто връща стойността на бита в дадената позиция. Тук:
redis> GETBIT mykey 1
(integer) 1
Но бит 0 не е зададен (по подразбиране е 0) по този начин:
redis> GETBIT mykey 0
(integer) 0