Như tên của nó, SETBIT
cho phép bạn thực hiện các thao tác với bit - cụ thể là đặt một bit nhất định thành 0 hoặc 1, tại một độ lệch bit nhất định, cho một khóa nhất định.
Điều quan trọng cần hiểu là kết quả không phải lúc nào cũng chỉ bao gồm các ký tự có thể in được. Đây là lý do tại sao Redis sử dụng hàm tùy chỉnh sdscatrepr
để định dạng đầu ra CLI:
Nối vào chuỗi sds "s" một biểu diễn chuỗi thoát trong đó tất cả các ký tự không in được (được kiểm tra với isprint ()) được chuyển thành các ký tự thoát ở dạng "\ n \ r \ a ...." hoặc "\ x" .
Điều đó đang được nói, hãy bắt đầu với một ví dụ đơn giản. Nếu bạn coi số hex 0x7F
(=127) biểu diễn nhị phân của nó trên 8 bit là:
pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
^ ^
| |
MSB LSB
Bạn thường có thể sử dụng SETBIT
để lưu trữ giá trị này, hãy nhớ rằng bù đắp 0
là MSB
và độ lệch 7 là 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
Nhận giá trị của bạn để kiểm tra nếu:
redis> GET myval
"\x7f"
Bây giờ điều gì xảy ra với nhiều byte? Giả sử bạn muốn lưu trữ 0x52
(=82) tương ứng với ký tự R
trong ASCII. Biểu diễn 8 bit là 01010010
với các vị trí bit (8, 9, ..., 15)
vì chúng tôi muốn nó được lưu trữ ngay sau giá trị đầu tiên:
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
Và bạn nhận được:
redis> GET myval
"\x7fR"
Ở đây Redis CLI có thể đại diện cho ký tự in được R
.
Khi tôi lưu trữ giá trị chuỗi 1 và 7 vào "mykey"
Nó tương ứng với 01000001
bằng 65 và 0x41
trong hex. Nó tương ứng với ký tự ASCII A
. Vì vậy, đang làm:
redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0
Cung cấp:
redis> GET mykey
"A"
getbit hoạt động như thế nào bên trong redis?
Nó chỉ trả về giá trị của bit tại vị trí đã cho. Đây:
redis> GETBIT mykey 1
(integer) 1
Nhưng bit 0 chưa được đặt (nó là 0 theo mặc định) do đó:
redis> GETBIT mykey 0
(integer) 0