如何使用 redigo 在 redis 中保存和检索映射?

Smn*_*Smn 3 go redis redigo

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

animals := map[string]bool{
    "cat": true,
    "dog":   false,
    "fox": true,
}
Run Code Online (Sandbox Code Playgroud)

地图的长度可能会有所不同。

我尝试了这些功能:

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
}
Run Code Online (Sandbox Code Playgroud)

但无法GetHash正确制作。我已经检查了文档示例,但没有帮助。因此,感谢您的帮助,以获得一个可行的示例。

Leo*_*llo 6

HMSET已弃用,HSET请改为使用,但在这里没有效果。

可以用 for进行map[string]bool展平。AddFlat()SetHash()

c.Do("HSET", redis.Args{}.Add("key").AddFlat(value)...)
Run Code Online (Sandbox Code Playgroud)

用来。GetHash()​ Values()您可以使用ScanStruct()映射到结构或循环遍历值来动态创建映射。

v, err := redis.Values(c.Do("HGETALL", key))
redis.ScanStruct(v, &myStruct);
Run Code Online (Sandbox Code Playgroud)

请参阅scan_test.go中 redigo 测试的示例。