Go 如何读取*redis.Client.TxPipeline.Exec()方法';s在映射[string]字符串中的响应
我正在使用redis.v5。我想一次性读取所有redis键的值,每个键的值都是hashMap,即map[string]string。因此,我正在使用MULTI/EXEC的Redis事务功能。我有一个函数可以这样做,我得到的响应如下:Go 如何读取*redis.Client.TxPipeline.Exec()方法';s在映射[string]字符串中的响应,go,redis,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
[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]]
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
我的职能是:
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]string。方法返回以下给定接口([]Cmder)的一部分:
这是Exec的定义:
func(c*管道)Exec()([]Cmder,错误)
和Cmder
实现
type Cmder interface {
Name() string
Args() []interface{}
Err() error
fmt.Stringer
// contains filtered or unexported methods
}
及
Cmder
实现定义为
type Stringer interface {
String() string
}
在哪里
Stringer由任何具有String方法的值实现,该方法
定义该值的“本机”格式。使用字符串方法
将作为操作数传递的值打印为接受
字符串或到未格式化的打印机,如打印
因此,
您可以通过执行以下操作来访问值:
Cmder.String()
所以你要找的是这样的东西:
[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]]
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
如果这不起作用,请告诉我。因为我在问题中共享了cmder界面,所以它不会导出名称和参数。因此,我不能在我的应用程序中使用cmd.Name()或cmd.Args()。当您执行
cmd.Name()
和cmd.Args()
时,您会得到什么输出?我无法访问Name和Args方法,因为在redis.v5中,它们没有导出。请查看上面提到的cmder接口结构。我还更新了GetListOfValuesForKeys()函数返回类型,当我在redis中为每个键值设置数据时,它实际上返回[]map[string]string(映射[string]string)。@negiYogi mate,接口
是一个行为契约,根据您发布的接口,它有Name()
和Args()
,并且根据定义,实现该接口的所有结构都必须具有这些函数