> 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
该值来存储该值,请记住offset0
为,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
等于650x41
的十六进制。它对应于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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句