gitee.com/lh-her-team/common@v1.5.1/gredis/redis.go (about) 1 package gredis 2 3 import ( 4 "encoding/json" 5 "errors" 6 "strconv" 7 "time" 8 9 "github.com/gomodule/redigo/redis" 10 ) 11 12 type RedisHandler struct { 13 RedisConn *redis.Pool 14 } 15 16 func NewRedisHandler() *RedisHandler { 17 r := new(RedisHandler) 18 return r 19 } 20 21 func (r *RedisHandler) Init(url, auth string, db, maxIdle, maxActive, idleTimeout int) error { 22 r.RedisConn = &redis.Pool{ 23 MaxIdle: maxIdle, 24 MaxActive: maxActive, 25 IdleTimeout: time.Duration(idleTimeout), 26 Dial: func() (redis.Conn, error) { 27 c, err := redis.Dial("tcp", url) 28 if err != nil { 29 return nil, err 30 } 31 if auth != "" { 32 if _, err = c.Do("AUTH", auth); err != nil { 33 c.Close() 34 return nil, err 35 } 36 } 37 if db != 0 { 38 if _, err = c.Do("SELECT", db); err != nil { 39 c.Close() 40 return nil, err 41 } 42 } 43 return c, err 44 }, 45 //应用程序检查健康功能 46 TestOnBorrow: func(c redis.Conn, _ time.Time) error { 47 _, err := c.Do("PING") 48 return err 49 }, 50 } 51 _, err := r.RedisConn.Get().Do("PING") 52 if err != nil { 53 return err 54 } 55 return nil 56 } 57 58 // Set json 59 func (r *RedisHandler) Set(key string, data interface{}, time int) error { 60 conn := r.RedisConn.Get() 61 defer conn.Close() 62 value, err := json.Marshal(data) 63 if err != nil { 64 return err 65 } 66 _, err = conn.Do("SET", key, value) 67 if err != nil { 68 return err 69 } 70 if time > 0 { 71 _, err = conn.Do("EXPIRE", key, time) 72 if err != nil { 73 return err 74 } 75 } 76 return nil 77 } 78 79 func (r *RedisHandler) SetVal(key, value interface{}, time int) error { 80 conn := r.RedisConn.Get() 81 defer conn.Close() 82 if v, ok := value.(int); ok { 83 value = strconv.Itoa(v) 84 } else if v, ok := value.(string); ok { 85 value = v 86 } else if v, ok := value.([]byte); ok { 87 value = v 88 } else { 89 return errors.New("redis set invalid value") 90 } 91 _, err := conn.Do("SET", key, value) 92 if err != nil { 93 return err 94 } 95 if time > 0 { 96 _, err = conn.Do("EXPIRE", key, time) 97 if err != nil { 98 return err 99 } 100 } 101 return nil 102 } 103 104 // Exists check a key 105 func (r *RedisHandler) Exists(key string) bool { 106 conn := r.RedisConn.Get() 107 defer conn.Close() 108 exists, err := redis.Bool(conn.Do("EXISTS", key)) 109 if err != nil { 110 return false 111 } 112 return exists 113 } 114 115 // ttl a key 116 func (r *RedisHandler) Ttl(key string) int { 117 conn := r.RedisConn.Get() 118 defer conn.Close() 119 ttl, err := redis.Int(conn.Do("TTL", key)) 120 if err != nil { 121 return -3 122 } 123 return ttl 124 } 125 126 // Get get a key 127 func (r *RedisHandler) Get(key string) ([]byte, error) { 128 conn := r.RedisConn.Get() 129 defer conn.Close() 130 reply, err := redis.Bytes(conn.Do("GET", key)) 131 if err != nil { 132 return nil, err 133 } 134 return reply, nil 135 } 136 137 func (r *RedisHandler) GetString(key string) (string, error) { 138 bytes, err := r.Get(key) 139 if err != nil { 140 return "", err 141 } 142 return string(bytes), nil 143 } 144 145 func (r *RedisHandler) GetInt(key string) (int, error) { 146 bytes, err := r.Get(key) 147 if err != nil { 148 return -1, err 149 } 150 sVal := string(bytes) 151 iVal, err := strconv.Atoi(sVal) 152 if err != nil { 153 return -1, err 154 } 155 return iVal, nil 156 } 157 158 // Delete delete a kye 159 func (r *RedisHandler) Delete(key string) (bool, error) { 160 conn := r.RedisConn.Get() 161 defer conn.Close() 162 return redis.Bool(conn.Do("DEL", key)) 163 } 164 165 // LikeDeletes batch delete 166 func (r *RedisHandler) LikeDeletes(key string) error { 167 conn := r.RedisConn.Get() 168 defer conn.Close() 169 keys, err := redis.Strings(conn.Do("KEYS", "*"+key+"*")) 170 if err != nil { 171 return err 172 } 173 for _, key := range keys { 174 _, err = r.Delete(key) 175 if err != nil { 176 return err 177 } 178 } 179 return nil 180 } 181 182 // Incr get a key 183 func (r *RedisHandler) Incr(key string) (int, error) { 184 conn := r.RedisConn.Get() 185 defer conn.Close() 186 reply, err := redis.Int(conn.Do("INCR", key)) 187 if err != nil { 188 return -1, err 189 } 190 return reply, nil 191 } 192 193 // GetSumLikeKeys - get the sum of all likely keys value 194 func (r *RedisHandler) GetSumLikeKeys(key string) (int, error) { 195 conn := r.RedisConn.Get() 196 defer conn.Close() 197 keys, err := redis.Strings(conn.Do("KEYS", "*"+key+"*")) 198 if err != nil { 199 return -1, err 200 } 201 sum := 0 202 for _, key := range keys { 203 val, err := r.GetInt(key) 204 if err != nil { 205 return -1, err 206 } 207 sum += val 208 } 209 return sum, nil 210 }