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

View File

@ -160,8 +160,8 @@ func Test_Redis_Type(t *testing.T) {
} }
type TestData struct { type TestData struct {
Name string Name string `json:"name"`
Agr int Agr int `json:"agr"`
} }
func Test_Redis_Encoder_Struct(t *testing.T) { 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) { func Test_Redis_Encoder_Hash(t *testing.T) {
// err := redis.HMSet("test:1003", &TestData{Name: "liwei1dao", Agr: 12}) err := redis.HMSet("test:1003", &TestData{Name: "liwei1dao", Agr: 12})
// fmt.Printf("err:%v\n", err) fmt.Printf("err:%v\n", err)
// data := &TestData{} // data := &TestData{}
// err = redis.HGetAll("test:1003", data) // err = redis.HGetAll("test:1003", data)
// fmt.Printf("data:%v err:%v\n", data, err) // 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}} // name := ""
err := redis.HMSet("test:1004", data1) // err := redis.HGet("test:1003", "Name", &name)
fmt.Printf("err:%v\n", err) // fmt.Printf("name:%v err:%v", name, err)
data2 := make(map[string]*TestData)
err = redis.HGetAll("test:1004", data2) // data1 := map[string]*TestData{"li_1": {Name: "liwei2dao", Agr: 56}, "li_2": {Name: "liwei3dao", Agr: 78}}
fmt.Printf("data2:%v err:%v\n", data2, err) // 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() elem := vof.Elem()
relType := elem.Type() relType := elem.Type()
for i := 0; i < relType.NumField(); i++ { 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() field := elem.Field(i).Interface()
var valuedata []byte var valuedata []byte
if valuedata, err = this.Encoder(field); err != nil { if valuedata, err = this.Encoder(field); err != nil {
return nil, fmt.Errorf("Encoder: EncoderToMap(invalid type %T) err:%v", field, err) return nil, fmt.Errorf("Encoder: EncoderToMap(invalid type %T) err:%v", field, err)
} }
data[relType.Field(i).Name] = valuedata data[name] = valuedata
} }
return return
} else { } else {