登录
首页 >  Golang >  Go问答

使用 redigo 在 Redis 中进行映射的存储和检索

来源:stackoverflow

时间:2024-02-21 13:54:23 476浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《使用 redigo 在 Redis 中进行映射的存储和检索》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

我有一个像这样的地图,我想使用 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
}

hmset 已弃用,请改用 hset,但此处不起作用。

对于 sethash()map[string]bool 可以使用 addflat() 进行展平。

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 测试的示例。

今天关于《使用 redigo 在 Redis 中进行映射的存储和检索》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>