对 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 位图进行获取操作返回奇怪的输出的主要内容,如果未能解决你的问题,请参考以下文章