gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:44:33 25 4
gpt4 key购买 nike

假设我有:"github.com/go-redis/redis" 包,并且我使用它的方法来触发自定义 Redis cmd:https://godoc.org/github.com/go-redis/redis#Client.Do

我最终得到:

result, err := client.Do("MEMORY", "STATS").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

基本上,它是一个带有数据属性的接口(interface),在数据中我们有更多的接口(interface)(偶数是键,奇数是值)。

我想输入它,以便获得“total.allocated”的值

正确的做法是什么?

最佳答案

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

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

您可以这样做:

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
}

关于go - 如何从redis Do()结果中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58389247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com