当前位置: 首页 > 面试题库 >

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

越雨泽
2023-03-14
问题内容
> 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。

刚刚完成了一个 快速版本,可从Redis中提取偏移量。请随时进行改进。


问题答案:

顾名思义,它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

通常SETBIT,可以使用该值来存储该值,请记住offset 0为,MSB而offset 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"

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


 类似资料:
  • 问题内容: 越来越多地使用Python,并且不断看到在不同文件中设置的变量。有人可以解释这是什么吗? 问题答案: 这是该模块的公共对象的列表,由解释import 。它覆盖了默认的内容,即隐藏以下划线开头的所有内容。

  • 问题内容: 情况1:这不会引起?。谁能告诉我为什么这不会导致ConcurrentModificationException。 情况2:这是由于我尝试访问AsyncThread中的线程不安全的人员列表。我可以使我的“人员列表”实现是线程安全的,并且应该可以运行。 谁能解释我到底发生了什么。我无法理解这是如何解决问题的。 案例2是否将实现从更改为推荐? 添加例外: 05-28 20:34:21.073

  • 问题内容: 年复一年,我试图了解部分与内存模型和并发交易的Java规范。我不得不承认我失败了。是的,我了解锁和“同步”,wait()和notify()。我可以很好地使用它们,谢谢。对于“ volatile”的作用,我什至不清楚。但是所有这些都不是来自语言规范,而是来自一般经验。 这是我要问的两个示例问题。我对特定答案不太感兴趣,因为我需要了解答案是如何从规范中得出的(或者可能是我得出结论,规范没有

  • 问题内容: 好的,所以我试图制作一个可以处理.wav文件的程序,并且已经看到了这个问题/答案,但是我不确定是标题中的每个数据指的是什么。例如,“块”指的是什么?那是特定数量的位/字节吗? 如果有人能至少以本问题中使用的格式告诉我,除常量String Literals和’data’数组外,每个引用到.wav的数据是什么?特别是,我特别想知道什么是“块”,以及所有通道的采样率,字节率,每个采样的字节和

  • 问题内容: 为什么在Python解释器中会发生以下情况? 为什么不呢? 问题答案: 那是因为不能以二进制浮点表示形式精确表示。如果你试试 Python会做出响应,因为它只能打印出一定的精度,但是已经存在一个小的舍入错误。也会发生同样的情况,但是当您发出 然后四舍五入误差并累积。另请注意:

  • 问题内容: 有两种通过play框架创建海关标签的方法。 通过在app / view / tags中定义一个Groovy模板 通过在类中直接扩展FastTag直接在纯Java中 没有最新的文件。 问题答案: 因此,类似于JavaExtensions通过扩展JavaExtensions类的工作方式,要创建FastTag,您需要创建一个扩展FastTags的类。您要作为标记执行的每个方法都必须符合以下方