如何使用redigo在redis中保存和检索地图?

3

我有这样一个地图,我想使用redigo保存/检索它:

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。我已经检查了文档中的示例,但没有帮助。因此,希望您能提供一个有效的示例。

2个回答

6

HMSET已被弃用,请使用HSET代替,但在这里没有影响。

map[string]bool可以通过AddFlat()SetHash()进行扁平化处理。

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

对于GetHash(),请使用Values()。您可以使用ScanStruct()将其映射到结构体,或循环遍历值以动态创建映射。

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

请查看scan_test.go中来自redigo测试的示例。


2

该应用程序负责将结构化类型转换为Redis所理解的类型,并从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
}

谢谢你的建议。请问我该如何为SetHash中的键设置超时时间? - Smn
2
使用 conn.Do("EXPIRE", key, secs)。请参阅 https://redis.io/commands/expire。最好使用 pipelining 进行操作: - LeoMurillo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接