对 Redis 位图进行获取操作返回奇怪的输出

Posted

技术标签:

【中文标题】对 Redis 位图进行获取操作返回奇怪的输出【英文标题】:Get operation on Redis bitmap returns weird output 【发布时间】:2015-12-29 09:17:01 【问题描述】:

我在redis中做setbit操作,标记某天有哪些用户在线。

我正在做一个redis get操作来获取key的值。

coffee> redis.setbit "a",7,1
true
coffee> redis.setbit "d",4,1
true
coffee> redis.setbit "g",1,1
true
coffee> redis.setbit "h",0,1

输出是

coffee> redis.get "a",(err,res)->console.log res.toString().charCodeAt(0)
true
coffee> 1

coffee> redis.get "d",(err,res)->console.log res.toString().charCodeAt(0)
true
coffee> 8

coffee> redis.get "g",(err,res)->console.log res.toString().charCodeAt(0)
true
coffee> 64

coffee> redis.get "h",(err,res)->console.log res.toString().charCodeAt(0)
true
coffee> 65533

我的问题是我将第 0 位设置为 1 的“h”键。它应该返回 128 但返回 65533。为什么会这样?

我的最终目标是从 redis 中获取二进制位图,以便我可以了解在特定日期哪些用户处于活动状态。

【问题讨论】:

你是在解析 unicode 字符吗? 不,它是redis中的位图,所以它可以是任何随机字符串,具体取决于哪些位将设置为1 通过 redis-cli 测试时,GET h 返回“\x80”(或十进制的 128)。 是的,我也检查过了,我得到一个 80 的缓冲区对象,但是当转换为字符串时,它返回 65533。有什么想法吗? 听起来客户端模块和/或堆栈设置有问题。仍然怀疑字符集 gremlin。 【参考方案1】:

由于 utf-8 编码而发生此错误。当我们将第 0 位设置为 1 时,它不遵循 utf-8 规则。现在,当我们尝试获取它时,我们得到了替换字符

U+FFFD �替换字符用于替换未知或 无法代表的角色

当我们对其执行 charCodeAt 时,我们将得到 65533。

阅读此处UTF-8 和Specials Unicode Block

【讨论】:

【参考方案2】:

秘诀是在连接时输入“return_buffers: true”。这会导致在使用该 redis 客户端的任何函数调用上返回缓冲区而不是字符串。

const client = redis.createClient(
    host: '192.168.1.89',
    port: 6379,
    return_buffers: true
    );

【讨论】:

以上是关于对 Redis 位图进行获取操作返回奇怪的输出的主要内容,如果未能解决你的问题,请参考以下文章

redis位图命令

Redis的基本操作语句

golang-redis系列——返回值助手函数(二)

pyspark when else 语句返回不正确的输出

Redis学习与应用-位图

如何优雅地使用Redis之位图操作