有人可以解释redis setbit命令吗?

Jos*_*hua 5 c redis

> setbit mykey 1 1
> setbit mykey 7 1
Run Code Online (Sandbox Code Playgroud)

当我将字符串值1和7存储到"mykey"中时,究竟存储在redis中的是什么?以及getbit如何在redis中运行?

有没有人试图在这个值内循环这个位?我知道bitcount会给我2号,但我也希望得到它的确切字符串值1和7,这可能吗?

-

我通过使用erlang redis客户端来读取输出做了一些实验.

> setbit mykey 1 1
Run Code Online (Sandbox Code Playgroud)

erlang输出:

<<"@">>
Run Code Online (Sandbox Code Playgroud)

然后我删除此条目:

> del mykey
Run Code Online (Sandbox Code Playgroud)

我做同样的事情来抵消2 4 8,在这里你可以看到映射:

When offset is 1, the output is <<"@">>;
When offset is 2, the output is <<" ">>;
When offset is 4, the output is <<"\b">>;
When offset is 8, the output is <<0,128>>;
Run Code Online (Sandbox Code Playgroud)

老实说,我现在更加困惑.

或者有人可以解释这个"bitops.c"

- 更新 - -

也许我应该提一下为什么我想这样做以使问题更清楚.我们都知道使用位图存储在线用户会很酷.我想要做的是从redis存储的内容中获取在线用户ID.

刚刚完成快速版本以从redis中提取偏移量.请随时改进它.

del*_*eil 13

顾名思义,SETBIT允许您执行位操作 - 即,对于给定的键,在给定的位偏移处将给定位设置为0或1.

重要的是要理解结果并不总是只包含可打印的字符.这就是Redis使用自定义函数sdscatrepr格式化CLI输出的原因:

将sds字符串"s"附加到转义字符串表示形式,其中所有不可打印的字符(使用isprint()测试)将转换为"\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
Run Code Online (Sandbox Code Playgroud)

您通常可以SETBIT用来存储此值,请记住偏移量0MSB和偏移量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
Run Code Online (Sandbox Code Playgroud)

如果出现以下情况,请检查您的值:

redis> GET myval
"\x7f"
Run Code Online (Sandbox Code Playgroud)

现在多字节会发生什么?假设您要存储0x52(= 82),这与RASCII中的字符相对应.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
Run Code Online (Sandbox Code Playgroud)

你得到:

redis> GET myval
"\x7fR"
Run Code Online (Sandbox Code Playgroud)

这里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
Run Code Online (Sandbox Code Playgroud)

得到:

redis> GET mykey
"A"
Run Code Online (Sandbox Code Playgroud)

getbit如何在redis中运行?

它只返回给定位置的位值.这里:

redis> GETBIT mykey 1
(integer) 1
Run Code Online (Sandbox Code Playgroud)

但是没有设置位0(默认为0)因此:

redis> GETBIT mykey 0
(integer) 0
Run Code Online (Sandbox Code Playgroud)