为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕莱坞森 2022-05-10 16:17:02
我有一张这样的地图,我想使用 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正确制作。我检查了文档示例,但没有帮助。因此,感谢您对提供工作示例的帮助。
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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

map[string]bool可以用forAddFlat()展平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测试的示例。


查看完整回答
反对 回复 2022-05-10
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

应用程序负责将结构化类型与 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

}


查看完整回答
反对 回复 2022-05-10
  • 2 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信