【问题标题】:Go Redis convert HGetAll result to structGo Redis 将 HGetAll 结果转换为结构
【发布时间】:2020-11-22 02:14:55
【问题描述】:

我正在从 redis.HGetAll 获取数据,但找不到将结果转换为我的结构的干净方法

var object struct {
    x int
}

result := redisClient.HGetAll(context.Background(), "the_h_key")

//TODO import the result content into the object 

这个壮观的案例有什么功能吗?

现在我使用 json 包(marshal,然后 UnMarshal 到 struct"。

【问题讨论】:

    标签: go redis go-redis


    【解决方案1】:

    Redis 的结果是一个 map[string]string。对于struct中的每个字段,从map中获取值,将字符串转换为字段类型并赋值给字段。

     var o object
     var err error
    
     o.x, err = strconv.Atoi(m["x"])
     if err != nil {
          // handle the error
     }
    
     ... repeat for other fields as needed
    

    【讨论】:

      【解决方案2】:

      如果您的数据结构不是太复杂,使用 redis 保存数据的一种便捷方法是使用 jsons。只需 json.Marhsal() 你的结构并将其保存为一个字符串,然后将 json.Unmarshal() 该字符串返回到你的结构中。

      【讨论】:

      • 我现在正在使用这种方式。但是这种方式有很多encode/decode,Redis hash能力在这里就没用了。
      • 您可以构建一个包装函数以避免代码重复@AminShojaei
      • 您对代码本身是正确的。但真正的问题是关于性能。如果我们避免json编码/解码,而使用纯数据会更好。
      • 我明白了。我不认为go-redis 支持这一点。我注意到另一个包redigo 有一个Scan 方法,但没有亲自使用过。
      • 稍后再加入,但会尝试澄清一些事情:Scan 是一个不同的命令,它不像 sql 包中的 row.Scan 扫描值并将其添加到一个指针。此外,OP 的初始任务是避免编组/解组一个值(本质上是一个严格的),因为他们担心 redis 的哈希功能完全不用这种方式。
      猜你喜欢
      • 2017-02-09
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2017-01-20
      • 2022-01-21
      相关资源
      最近更新 更多