Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用redigo将地图保存和检索到redis?_Go_Redis_Redigo - Fatal编程技术网

如何使用redigo将地图保存和检索到redis?

如何使用redigo将地图保存和检索到redis?,go,redis,redigo,Go,Redis,Redigo,我有一张这样的地图,我想用redigo从redis保存/检索它: 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() _,

我有一张这样的地图,我想用redigo从redis保存/检索它:

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
。我已经检查了示例,但没有任何帮助。因此,感谢您的帮助,让我们有一个工作的例子

应用程序负责将结构化类型与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
}
func GetHash(键字符串)(map[string]bool,错误){
conn:=Pool.Get()
延迟连接关闭()
值,err:=redis.Strings(conn.Do(“HGETALL”,key))
如果错误!=零{
返回零,错误
}
//循环通过[field value]…并将值解析为bool。
m:=map[string]bool{}
对于i:=0;i
HMSET
已被弃用,请改用
HSET
,但此处无效

对于
SetHash()
,可以使用
AddFlat()
展平
map[string]bool

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

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

请参阅中的redigo测试示例。

谢谢您的提示。请告诉我如何将密钥的超时设置为
SetHash
?使用
conn.Do(“EXPIRE”,key,secs)
。看见你最好是:
v, err := redis.Values(c.Do("HGETALL", key))
redis.ScanStruct(v, &myStruct);