我正在使用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
}
提前致谢。
答案 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
如果这不起作用,请告诉我。