猿问

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

鉴于我有:"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"。


正确的做法是什么?


慕标琳琳
浏览 137回答 2
2回答

慕虎7371278

这是特定于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}

ITMISS

在伪 Golang 中,它看起来像这样:result, err := redis.StringMap(client.Do("MEMORY", "STATS"), err)
随时随地看视频慕课网APP

相关分类

Go
我要回答