Как я могу сохранить и восстановить карту в Redis, используя redi go? - PullRequest
1 голос
/ 30 января 2020

У меня есть такая карта, которую я хочу сохранить / извлечь из redis, используя redi go:

animals := map[string]bool{
    "cat": true,
    "dog":   false,
    "fox": true,
}

Длина карты может отличаться.

Я попробовал эти функции:

func SetHash(key string, value map[string]bool) error {
    conn := Pool.Get()
    defer conn.Close()
    _, err := conn.Do("HMSET", key, value)
    if err != nil {
        return fmt.Errorf("error setting key %s to %s: %v", key, value, err)
    }
    return err
}


func GetHash(key string) (map[string]bool, error) {
    conn := Pool.Get()
    defer conn.Close()
    val, err := conn.Do("HGETALL", key)
    if err != nil {
        fmt.Errorf("error setting key %s to %s: %v", key, nil, err)
        return nil,  err
    }
    return val, err
}

Но не могу сделать GetHash правильно. Я проверил docs примеры, и это не помогло. Поэтому ценим вашу помощь, чтобы иметь рабочий пример.

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Приложение отвечает за преобразование структурированных типов в и из типов, понятных Redis.

Сведение карты в список аргументов:

func SetHash(key string, value map[string]bool) error {
    conn := Pool.Get()
    defer conn.Close()

    // Create arguments: key field value [field value]...
    var args = []interface{}{key}
    for k, v := range value {
        args = append(args, k, v)
    }

    _, err := conn.Do("HMSET", args...)
    if err != nil {
        return fmt.Errorf("error setting key %s to %v: %v", key, value, err)
    }
    return err
}

Преобразование пар возвращаемых значений поля на карту:

func GetHash(key string) (map[string]bool, error) {
    conn := Pool.Get()
    defer conn.Close()
    values, err := redis.Strings(conn.Do("HGETALL", key))
    if err != nil {
        return nil, err
    }

        // Loop through [field value]... and parse value as bool.
    m := map[string]bool{}
    for i := 0; i < len(values); i += 2 {
        b, err := strconv.ParseBool(value)
        if err != nil {
            return nil, errors.New("value not a bool")
        }
        m[key] = b
    }
    return m, nil
}
1 голос
/ 30 января 2020

HMSET устарело, вместо этого используйте HSET, здесь никакого эффекта нет.

map[string]bool может быть сведено с AddFlat() для SetHash().

c.Do("HSET", redis.Args{}.Add("key").AddFlat(value)...)

Для GetHash() используйте Values(). Вы можете использовать ScanStruct() для отображения на структуру или l oop через значения для динамического создания карты.

v, err := redis.Values(c.Do("HGETALL", key))
redis.ScanStruct(v, &myStruct);

См. Пример из redi go тестов в scan_test. go.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...