Sesuai dengan namanya, SETBIT
memungkinkan Anda untuk melakukan operasi bit - yaitu menyetel bit tertentu ke 0 atau 1, pada offset bit tertentu, untuk kunci tertentu.
Yang penting untuk dipahami adalah bahwa hasilnya tidak selalu hanya mencakup karakter yang dapat dicetak. Inilah sebabnya mengapa Redis menggunakan fungsi khusus sdscatrepr
untuk memformat keluaran CLI:
Tambahkan ke string sds "s" representasi string yang lolos di mana semua karakter yang tidak dapat dicetak (diuji dengan isprint()) diubah menjadi escape dalam bentuk "\n\r\a...." atau "\x" .
Yang sedang berkata mari kita mulai dengan contoh sederhana. Jika Anda mempertimbangkan angka heksadesimal 0x7F
(=127) representasi binernya pada 8-bit adalah:
pos: 0 1 2 3 4 5 6 7
bit: 0 1 1 1 1 1 1 1
^ ^
| |
MSB LSB
Anda biasanya dapat menggunakan SETBIT
untuk menyimpan nilai ini, dengan mengingat bahwa offset 0
adalah MSB
dan offset 7 adalah 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
Dapatkan nilai Anda untuk diperiksa jika:
redis> GET myval
"\x7f"
Sekarang apa yang terjadi dengan multi byte? Katakanlah Anda ingin menyimpan 0x52
(=82) yang sesuai dengan karakter R
di ASCII. Representasi 8-bit adalah 01010010
dengan posisi bit (8, 9, ..., 15)
karena kami ingin menyimpannya tepat setelah nilai pertama:
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
Dan Anda mendapatkan:
redis> GET myval
"\x7fR"
Di sini Redis CLI mampu merepresentasikan karakter yang dapat dicetak R
.
Ketika saya menyimpan nilai string 1 dan 7 ke "mykey"
Ini sesuai dengan 01000001
yang sama dengan 65 dan 0x41
dalam heksa. Ini sesuai dengan karakter ASCII A
. Begitu pula:
redis> SETBIT mykey 1 1
(integer) 0
redis> SETBIT mykey 7 1
(integer) 0
Memberikan:
redis> GET mykey
"A"
bagaimana getbit bekerja di dalam redis?
Ini hanya mengembalikan nilai bit pada posisi yang diberikan. Di sini:
redis> GETBIT mykey 1
(integer) 1
Tetapi bit 0 belum disetel (secara default adalah 0) dengan demikian:
redis> GETBIT mykey 0
(integer) 0