redis-cli如何对在HLL或位图上执行GET返回的字符串值进行编码?

时间:2018-09-02 13:49:06

标签: go encoding redis

假设我已经使用以下命令设置了位图

setbit key 0 1
setbit key 1 1
setbit key 2 0
setbit key 3 1
setbit key 4 1

当我从redis-cli上获取此密钥时,得到以下结果:"\xd8"

但是当我使用go-redis API进行操作时,会得到不同的结果,这是:@ @p

要获得上述结果,我使用了以下代码:

package main

import (
    "fmt"

    "github.com/go-redis/redis"
)

func main() {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })

    pong, _ := client.Ping().Result()
    fmt.Println(pong)

    client.SetBit("key", 0, 1)
    client.SetBit("key", 1, 1)
    client.SetBit("key", 2, 0)
    client.SetBit("key", 3, 1)
    client.SetBit("key", 4, 1)  

    res := client.Get("bmk").Val()
    fmt.Println(res)

}

我在redis文档中的任何地方都找不到它,cli使用哪种编码来产生这样的结果。我也想在go程序中将结果转换为相同的格式。

有人可以告诉我这是哪种编码,如何将从Redis API接收到的结果转换为CLI所获得的结果?

1 个答案:

答案 0 :(得分:2)

redis-cli和Go程序在某些键上的GET获得相同的结果。您观察到的差异是如何格式化结果值以输出。

问题中的Go程序按原样写入数据。

用于编码输出的redis-cli代码为here。该函数对换行符,引号等使用典型的反斜杠转义,对其他不可打印的字节使用\x<hex number>

使用fmt包“%q”动词以类似的格式输出数据:

fmt.Printf("%q\n", res)

如果您需要完全相同的格式,则需要将内部Redis函数转换为Go。