如何在golang中的map [string]字符串中读取* redis.Client.TxPipeline.Exec()方法的响应

时间:2018-04-20 13:01:57

标签: go redis

我正在使用redis.v5。我想一次读取所有redis键值,每个键的值是hashMap即map [string] string。所以我使用的是MULTI / EXEC的Redis事务功能。我有一个功能,这样做,我得到这样的回应:

[hgetall x: map[VIN:POIUYTRUT4567ASWQ beaconID:1123VBG132 customerName:Amit displayLocation:waiting launge timestamp:2017-12-26T08:51:21.509Z] y: map[VIN:POIUYTRUT4567qweD beaconID:1123VBG13222 customerName:prameet displayLocation:waiting launge timestamp:2017-12-26T08:51:21.509Z]]

我的功能是:

 func GetListOfValuesForKeys( keys []string,address, password string,db int) ([]map[string]string, error) {
    redisClient, err := redis.NewClient(loadRedisOptions(address, password, db))
    if err != nil {
        return nil, err
    }
    pipe := redisClient.TxPipeline()
    for _, val := range keys {
        pipe.HGetAll(val)
    }
    var data []map[string]string

    cmder, err := pipe.Exec()
    if err != nil {
        return nil, err
    }
    fmt.Printf("\n|**********res %++v**************|\n", cmder)

    return data, nil
}

func loadRedisOptions(address, password string, db int) *redis.Options 
{

return &redis.Options{
    Addr:     address,
    Password: password,
    DB:       db,
}
}

现在redis.v5中有任何内置方法可以解组pipe.Exec()方法对map [string]字符串的响应。 pipe.Exec()方法返回给定下面的接口切片([] Cmder):

    type Cmder interface {
    args() []interface{}
    arg(int) string
    name() string

    readReply(*pool.Conn) error
    setErr(error)

    readTimeout() *time.Duration

    Err() error
    fmt.Stringer
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

这是Exec的定义:

func (c *Pipeline) Exec() ([]Cmder, error)

Cmder实现

type Cmder interface {
    Name() string
    Args() []interface{}

    Err() error
    fmt.Stringer
    // contains filtered or unexported methods
}

Cmder实现fmt.Stringer,定义为

type Stringer interface {
    String() string
}

其中

  

Stringer是由任何具有String方法的值实现的   定义该值的“本机”格式。使用String方法   将作为操作数传递的值打印到任何接受a的格式   字符串或未格式化的打印机,如Print。

https://godoc.org/fmt#Stringer

<强>因此,

您可以通过执行以下操作来访问值:

Cmder.String()

所以你要找的是这样的:

cmdMap := map[string]string
cmder, err := pipe.Exec()
if err != nil {
    return nil, err
}
for cmd := range cmder {
    key := cmd.Name() // maybe use cmd.Args() to distinguish
    cmdMap[key] = cmd.String()
}
return cmdMap, nil

如果这不起作用,请告诉我。