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

时间:2013-12-19 03:50:11

标签: c redis

> 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 <<"\b">>;
When offset is 8, the output is <<0,128>>;

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

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

- 更新---

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

刚刚完成quick version以从redis中提取偏移量。请随时改进它。

2 个答案:

答案 0 :(得分:12)

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

重要的是要理解的是,结果并不总是只包含可打印的字符。这就是Redis使用custom function sdscatrepr格式化CLI输出的原因:

  

在sds字符串“s”附加一个转义字符串表示形式,其中所有不可打印的字符(使用isprint()测试)都以“\ n \ r \ a ...”或“”形式转换为转义符\×”。

话虽如此,让我们从一个简单的例子开始。如果考虑十六进制数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,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

答案 1 :(得分:1)

您可以在http://redis.io

中看到确切的详细信息

GETBIT键偏移

返回key中存储的字符串值中offset的位值。 当offset超出字符串长度时,假定该字符串是一个0位的连续空格。当key不存在时,它被假定为空字符串,因此offset总是超出范围,并且该值也被假定为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>