Как извлечь данные из результата redis Do () - PullRequest
1 голос
/ 15 октября 2019

Учитывая, что у меня есть: "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 ]

0 голосов
/ 15 октября 2019

Redigo имеет помощника только для этого: https://github.com/gomodule/redigo/blob/master/redis/reply.go#L377

В псевдоголанге это выглядит так:

result, err := redis.StringMap(client.Do("MEMORY", "STATS"), err)
0 голосов
/ 15 октября 2019

Это относится к команде MEMORY STATS redis. Его результатом является массив, "информация об использовании памяти предоставляется в виде метрик и их соответствующих значений" .

Поскольку для моделирования этого не существует "предопределенного" типа, просто используйте введите утверждение , чтобы получить фрагмент в 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...