github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgRedis/dbGob.go (about) 1 package kmgRedis 2 import ( 3 "github.com/bronze1man/kmg/encoding/kmgGob" 4 "github.com/bronze1man/kmg/typeTransform" 5 "reflect" 6 "fmt" 7 ) 8 9 // 向redis中插入数据,如果已经存在数据会返回 ErrKeyExist 10 func InsertGob(key string, obj interface{}) (err error) { 11 b, err := kmgGob.Marshal(obj) 12 if err != nil { 13 return 14 } 15 return Insert(key, string(b)) 16 } 17 18 func MustInsertGob(key string, obj interface{}) { 19 err := InsertGob(key, obj) 20 if err != nil { 21 panic(err) 22 } 23 } 24 25 func SetGob(key string, obj interface{}) (err error) { 26 b, err := kmgGob.Marshal(obj) 27 if err != nil { 28 return 29 } 30 return Set(key, string(b)) 31 } 32 33 func MustSetGob(key string, obj interface{}) { 34 err := SetGob(key, obj) 35 if err != nil { 36 panic(err) 37 } 38 } 39 40 func GetGobIgnoreNotExist(key string, obj interface{}) (err error) { 41 err = GetGob(key, obj) 42 if err == ErrKeyNotExist { 43 return nil 44 } 45 return err 46 } 47 48 func MustGetGob(key string, obj interface{}) { 49 err := GetGob(key, obj) 50 if err != nil { 51 panic(err) 52 } 53 } 54 55 // 向redis中更新数据,如果不存在数据,会返回 ErrKeyNotExist 56 func UpdateGob(key string, obj interface{}) (err error) { 57 b, err := kmgGob.Marshal(obj) 58 if err != nil { 59 return 60 } 61 return Update(key, string(b)) 62 } 63 64 // 如果数据不存在,会返回ErrKeyNotExist 65 // 序列化错误,会返回 error 66 // 网络错误也会返回 error 67 func GetGob(key string, obj interface{}) (err error) { 68 value, err := Get(key) 69 if err != nil { 70 return err 71 } 72 err = kmgGob.Unmarshal([]byte(value), obj) 73 if err != nil { 74 return err 75 } 76 return nil 77 } 78 79 func RPushGob(key string, value interface{}) (err error) { 80 b, err := kmgGob.Marshal(value) 81 if err != nil { 82 return err 83 } 84 return RPush(key, string(b)) 85 } 86 87 func LRangeAllGob(key string, list interface{}) (err error) { 88 sList, err := LRangeAll(key) 89 iList := []interface{}{} 90 typeTransform.MustTransform(&sList,&iList) 91 if err != nil { 92 return err 93 } 94 return ListGobUnmarshalNotExistCheck(iList, reflect.ValueOf(list)) 95 } 96 97 /* 98 带超时的设置一条数据 99 没有传入数据,不报错,不修改obj 100 网络错误会返回error 101 */ 102 func MGetNotExistCheckGob(keyList []string, obj interface{}) (err error) { 103 if len(keyList) == 0 { 104 return nil 105 } 106 outList, err := gClient.MGet(keyList...).Result() 107 if err != nil { 108 return err 109 } 110 return ListGobUnmarshalNotExistCheck(outList, reflect.ValueOf(obj)) 111 } 112 113 func ListGobUnmarshalNotExistCheck(outList []interface{}, obj reflect.Value) (err error) { 114 switch obj.Kind() { 115 case reflect.Ptr: 116 return ListGobUnmarshalNotExistCheck(outList, obj.Elem()) 117 case reflect.Slice: 118 newSlice := reflect.MakeSlice(obj.Type(), len(outList), len(outList)) 119 elemType := obj.Type().Elem() 120 for i, stringI := range outList { 121 s, ok := stringI.(string) 122 if !ok { 123 return ErrKeyNotExist 124 } 125 thisValue := newSlice.Index(i) 126 thisElem := reflect.New(elemType) 127 err = kmgGob.Unmarshal([]byte(s), thisElem.Interface()) 128 if err != nil { 129 return err 130 } 131 thisValue.Set(thisElem.Elem()) 132 } 133 obj.Set(newSlice) 134 return nil 135 default: 136 return fmt.Errorf("[mgetNotExistCheckGobUnmarshal] Unmarshal unexpect Kind %s", obj.Kind().String()) 137 } 138 }