その名前が示すように、SETBIT
ビット演算を実行できます。つまり、特定のキーに対して、特定のビットオフセットで特定のビットを0または1に設定します。
理解しておくべき重要なことは、結果には必ずしも印刷可能な文字だけが含まれるとは限らないということです。これが、Redisがカスタム関数sdscatrepr
を使用する理由です。 CLI出力をフォーマットするには:
sds文字列"s"にエスケープされた文字列表現を追加します。ここで、印刷できないすべての文字(isprint()でテスト)が "\ n \ r \a...."または"\x"の形式でエスケープに変換されます。 。
そうは言っても、簡単な例から始めましょう。 16進数の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"
ここで、RedisCLIは印刷可能な文字R
を表すことができます 。
文字列値1と7を「mykey」に格納すると
01000001
に対応します これは65と0x41
に等しい 16進数で。 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