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

> setbit mykey 1 1 > setbit mykey 7 1 

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

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

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

 > setbit mykey 1 1 

erlang输出:

 <> 

然后我删除这个条目:

 > del mykey 

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

 When offset is 1, the output is <>; When offset is 2, the output is <>; When offset is 4, the output is <>; When offset is 8, the output is <>; 

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

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

– 更新 – –

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

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

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

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

将sds字符串“s”附加到转义字符串表示forms,其中所有不可打印的字符(使用isprint()测试)将转换为“\ n \ r \ a …”或“\ x”forms的转义符。

话虽如此,让我们从一个简单的例子开始。 如果考虑hex数0x7F (= 127),它在8位上的二进制表示是:

 pos: 0 1 2 3 4 5 6 7 bit: 0 1 1 1 1 1 1 1 ^ ^ | | MSB LSB 

您通常可以使用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 

在以下情况下获取您的检查价值:

 redis> GET myval "\x7f" 

现在多字节会发生什么? 假设您要存储0x52 (= 82),它对应于ASCII中的字符R 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,hex为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 

你可以在http://redis.io中看到确切的细节

GETBIT键偏移量

返回存储在key处的字符串值中offset处的位值。 当offset超出字符串长度时,假定该字符串是一个0位的连续空格。 当密钥不存在时,它被假定为空字符串,因此偏移量总是超出范围,并且该值也被假定为具有0位的连续空间。

例子:

 redis> SETBIT mykey 7 1 (integer) 0 redis> GETBIT mykey 0 (integer) 0 redis> GETBIT mykey 7 (integer) 1 redis> GETBIT mykey 100 (integer) 0 redis>