修复redis hash序列化 字段名接收tag json 标签

This commit is contained in:
liwei1dao 2022-06-16 15:55:19 +08:00
parent 7c09e141cd
commit 2a4c3d97ea
3 changed files with 28 additions and 15 deletions

View File

@ -1,6 +1,7 @@
package cluster
import (
"go_dreamfactory/lego/utils/codec"
"reflect"
"github.com/go-redis/redis/v8"
@ -52,10 +53,12 @@ func (this *Redis) HMSet(key string, v interface{}) (err error) {
/*
Redis Hget 命令用于返回哈希表中指定字段的值
*/
func (this *Redis) HGet(key string, field string, value interface{}) (err error) {
var resultvalue string
if resultvalue = this.client.Do(this.getContext(), "HSET", key, field).String(); resultvalue != string(redis.Nil) {
err = this.decode.Decoder([]byte(resultvalue), value)
func (this *Redis) HGet(key string, field string, v interface{}) (err error) {
cmd := redis.NewStringCmd(this.getContext(), "HGET", key, field)
this.client.Process(this.getContext(), cmd)
var _result string
if _result, err = cmd.Result(); err == nil {
err = this.decode.Decoder(codec.StringToBytes(_result), v)
}
return
}

View File

@ -160,8 +160,8 @@ func Test_Redis_Type(t *testing.T) {
}
type TestData struct {
Name string
Agr int
Name string `json:"name"`
Agr int `json:"agr"`
}
func Test_Redis_Encoder_Struct(t *testing.T) {
@ -177,16 +177,20 @@ func Test_Redis_Encoder_int(t *testing.T) {
}
func Test_Redis_Encoder_Hash(t *testing.T) {
// err := redis.HMSet("test:1003", &TestData{Name: "liwei1dao", Agr: 12})
// fmt.Printf("err:%v\n", err)
err := redis.HMSet("test:1003", &TestData{Name: "liwei1dao", Agr: 12})
fmt.Printf("err:%v\n", err)
// data := &TestData{}
// err = redis.HGetAll("test:1003", data)
// fmt.Printf("data:%v err:%v\n", data, err)
data1 := map[string]*TestData{"li_1": {Name: "liwei2dao", Agr: 56}, "li_2": {Name: "liwei3dao", Agr: 78}}
err := redis.HMSet("test:1004", data1)
fmt.Printf("err:%v\n", err)
data2 := make(map[string]*TestData)
err = redis.HGetAll("test:1004", data2)
fmt.Printf("data2:%v err:%v\n", data2, err)
// name := ""
// err := redis.HGet("test:1003", "Name", &name)
// fmt.Printf("name:%v err:%v", name, err)
// data1 := map[string]*TestData{"li_1": {Name: "liwei2dao", Agr: 56}, "li_2": {Name: "liwei3dao", Agr: 78}}
// err := redis.HMSet("test:1004", data1)
// fmt.Printf("err:%v\n", err)
// data2 := make(map[string]*TestData)
// err = redis.HGetAll("test:1004", data2)
// fmt.Printf("data2:%v err:%v\n", data2, err)
}

View File

@ -98,12 +98,18 @@ func (this *Encoder) EncoderToMap(v interface{}) (data map[string][]byte, err er
elem := vof.Elem()
relType := elem.Type()
for i := 0; i < relType.NumField(); i++ {
fieldInfo := relType.Field(i)
tag := fieldInfo.Tag
name := tag.Get("json")
if len(name) == 0 {
name = fieldInfo.Name
}
field := elem.Field(i).Interface()
var valuedata []byte
if valuedata, err = this.Encoder(field); err != nil {
return nil, fmt.Errorf("Encoder: EncoderToMap(invalid type %T) err:%v", field, err)
}
data[relType.Field(i).Name] = valuedata
data[name] = valuedata
}
return
} else {