为了账号安全,请及时绑定邮箱和手机立即绑定

如何从redis Do()结果中提取数据

如何从redis Do()结果中提取数据

Go
慕标琳琳 2023-07-31 14:54:45
鉴于我有:"github.com/go-redis/redis"包,并且我使用它的方法来触发自定义 Redis cmd:https://godoc.org/github.com/go-redis/redis#Client.Do我最终得到:result, err := client.Do("MEMORY", "STATS").Result()result看起来如下:<interface {}> data:<[]interface {}> (length: 52, cap: 52)  [0]:<interface {}>   data:"peak.allocated"  [1]:<interface {}>   data:4957760  [2]:<interface {}>    data:"total.allocated"  [3]:<interface {}>    data:855632  [4]:<interface {}>  //... and so on基本上,它是一个带有数据属性的接口,在数据中我们有更多的接口(偶数是键,奇数是值)。我想输入它,这样我就可以获得 的值"total.allocated"。正确的做法是什么?
查看完整描述

2 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

这是特定于MEMORY STATSredis 命令的。其结果是一个数组,“有关内存使用情况的信息以指标及其各自的值的形式提供”

由于没有“预定义”类型来对此进行建模,因此只需使用类型断言来获取 Go 中的切片,对其进行迭代,然后查找您感兴趣的键:"total.allocated"。后续切片元素将是您要查找的值。

您可以这样做:

result, err := client.Do("MEMORY", "STATS").Result()

if err != nil {

    // Handle error

    return

}

if stats, ok := result.([]interface{}); ok {

    for i := 0; i < len(stats); i += 2 {

        if stats[i] == "total.allocated" && i+1 < len(stats) {

            fmt.Println("total allocated memory:", stats[i+1])

        }

    }

}

len-1如果我们循环直到(而不是),我们可以简化循环len,因此我们不必检查i+1索引是否有效:


for i, max := 0, len(stats)-1; i < max; i += 2 {

    if stats[i] == "total.allocated" {

        fmt.Println("total allocated memory:", stats[i+1])

    }

}

总分配内存的值是类型的值int64。如果您需要它作为数字,请使用另一个类型断言:


allocated := stats[i+1].(int64)

或者为了安全起见:


if allocated, ok := stats[i+1].(int64); ok {

    // Use allocated

}


查看完整回答
反对 回复 2023-07-31
?
ITMISS

TA贡献1871条经验 获得超8个赞

在伪 Golang 中,它看起来像这样:

result, err := redis.StringMap(client.Do("MEMORY", "STATS"), err)


查看完整回答
反对 回复 2023-07-31
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信