gitee.com/h79/goutils@v1.22.10/dao/redis/pool/hash.go (about) 1 package pool 2 3 import ( 4 "context" 5 "fmt" 6 7 "github.com/go-redis/redis/v8" 8 ) 9 10 // Hash 11 12 //HSetWithBatch 批量插入多个key 13 func (c *Client) HSetWithBatch(ctx context.Context, keys []string, field string, value interface{}) (int64, error) { 14 client, cErr := getClusterClient(c) 15 16 if cErr != nil { 17 return 0, cErr 18 } 19 20 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 21 for _, k := range keys { 22 pipe.HSet(ctx, k, field, value) 23 } 24 return nil 25 }) 26 if err != nil { 27 return 0, err 28 } 29 for _, cmd := range cmds { 30 res, err := cmd.(*redis.IntCmd).Result() 31 if err != nil { 32 return res, err 33 } 34 } 35 return 0, nil 36 } 37 38 //HSetWithBatch 批量插入多个key 39 func (c *Client) HSetNXWithBatch(ctx context.Context, keys []string, field string, value interface{}) (bool, error) { 40 client, cErr := getClusterClient(c) 41 42 if cErr != nil { 43 return false, cErr 44 } 45 46 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 47 for _, k := range keys { 48 pipe.HSetNX(ctx, k, field, value) 49 } 50 return nil 51 }) 52 53 res := true 54 err = nil 55 for _, cmd := range cmds { 56 res, err = cmd.(*redis.BoolCmd).Result() 57 if err != nil { 58 break 59 } 60 } 61 return res, err 62 } 63 64 //HMSet 批量HSet 65 func (c *Client) HMSet(ctx context.Context, key string, fields map[string]interface{}) (bool, error) { 66 client, cErr := getClusterClient(c) 67 68 if cErr != nil { 69 return false, cErr 70 } 71 72 return client.HMSet(ctx, key, fields).Result() 73 } 74 75 //HMSetReq 批量HMSet参数 76 type HMSetReq struct { 77 Key string 78 Filed map[string]interface{} 79 } 80 81 //HMSetWithBatch 批量HMSet 82 func (c *Client) HMSetWithBatch(ctx context.Context, reqs []*HMSetReq) (res string, err error) { 83 client, cErr := getClusterClient(c) 84 85 if cErr != nil { 86 return "", cErr 87 } 88 89 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 90 for _, r := range reqs { 91 pipe.HMSet(ctx, r.Key, r.Filed) 92 } 93 return nil 94 }) 95 96 if err != nil { 97 return "", err 98 } 99 100 res = "" 101 err = nil 102 for _, cmd := range cmds { 103 res, err = cmd.(*redis.StatusCmd).Result() 104 if err != nil { 105 break 106 } 107 } 108 109 return res, err 110 } 111 112 //HGet Hash table 查询 113 func (c *Client) HGet(ctx context.Context, key, field string) (string, error) { 114 client, cErr := getClusterClient(c) 115 116 if cErr != nil { 117 return "", cErr 118 } 119 120 return client.HGet(ctx, key, field).Result() 121 } 122 123 //HMGet 批量获取Hash table 124 func (c *Client) HMGet(ctx context.Context, key string, fields ...string) (map[string]interface{}, error) { 125 client, cErr := getClusterClient(c) 126 127 if cErr != nil { 128 return nil, cErr 129 } 130 131 res, err := client.HMGet(ctx, key, fields...).Result() 132 fmt.Println(res) 133 if err != nil { 134 return nil, err 135 } 136 137 resMap := make(map[string]interface{}, 0) 138 139 for i, f := range fields { 140 141 resMap[f] = res[i] 142 } 143 return resMap, err 144 } 145 146 //HGetAll 获取整个Hash table 147 func (c *Client) HGetAll(ctx context.Context, key string) (map[string]string, error) { 148 client, cErr := getClusterClient(c) 149 150 if cErr != nil { 151 return nil, cErr 152 } 153 154 res, err := client.HGetAll(ctx, key).Result() 155 return res, err 156 } 157 158 //HDel 批量 Del 159 func (c *Client) HDel(ctx context.Context, key string, fields ...string) (int64, error) { 160 client, cErr := getClusterClient(c) 161 162 if cErr != nil { 163 return 0, cErr 164 } 165 166 res, err := client.HDel(ctx, key, fields...).Result() 167 return res, err 168 } 169 170 //MHDelreq 批量HDel参数 171 type MHDelreq struct { 172 Key string 173 Field []string 174 } 175 176 //HDelWithBatch 批量HDel 177 func (c *Client) HDelWithBatch(ctx context.Context, reqs []*MHDelreq) (res int64, err error) { 178 client, cErr := getClusterClient(c) 179 180 if cErr != nil { 181 return 0, cErr 182 } 183 184 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 185 for _, r := range reqs { 186 pipe.HDel(ctx, r.Key, r.Field...) 187 } 188 return nil 189 }) 190 191 if err != nil { 192 return 0, err 193 } 194 195 res = 0 196 err = nil 197 for _, cmd := range cmds { 198 res, err = cmd.(*redis.IntCmd).Result() 199 if err != nil { 200 break 201 } 202 } 203 204 return res, err 205 } 206 207 //HKeys 获取hash table中的fields 208 func (c *Client) HKeys(ctx context.Context, key string) (res []string, err error) { 209 client, cErr := getClusterClient(c) 210 211 if cErr != nil { 212 return nil, cErr 213 } 214 215 res, err = client.HKeys(ctx, key).Result() 216 return res, err 217 } 218 219 //HVals 获取hash vals 220 func (c *Client) HVals(ctx context.Context, key string) (res []string, err error) { 221 client, cErr := getClusterClient(c) 222 223 if cErr != nil { 224 return nil, cErr 225 } 226 227 res, err = client.HVals(ctx, key).Result() 228 return res, err 229 } 230 231 //HIncrBy field中的值增加inrc 232 func (c *Client) HIncrBy(ctx context.Context, key string, field string, inrc int64) (res int64, err error) { 233 client, cErr := getClusterClient(c) 234 235 if cErr != nil { 236 return 0, cErr 237 } 238 239 res, err = client.HIncrBy(ctx, key, field, inrc).Result() 240 return res, err 241 } 242 243 //MHIncrByReq 批量 HIncrBy 参数 244 type MHIncrByReq struct { 245 Key string 246 Field string 247 Inrc int64 248 } 249 250 //HIncrByWithBatch 批量 HIncrBy 251 func (c *Client) HIncrByWithBatch(ctx context.Context, reqs []*MHIncrByReq) (res int64, err error) { 252 client, cErr := getClusterClient(c) 253 254 if cErr != nil { 255 return 0, cErr 256 } 257 258 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 259 for _, r := range reqs { 260 pipe.HIncrBy(ctx, r.Key, r.Field, r.Inrc) 261 } 262 return nil 263 }) 264 265 if err != nil { 266 return 0, err 267 } 268 269 res = 0 270 err = nil 271 for _, cmd := range cmds { 272 res, err = cmd.(*redis.IntCmd).Result() 273 if err != nil { 274 break 275 } 276 } 277 278 return res, err 279 } 280 281 //HIncrByFloat HIncrBy 的float版 282 func (c *Client) HIncrByFloat(ctx context.Context, key string, field string, inrc float64) (res float64, err error) { 283 client, cErr := getClusterClient(c) 284 285 if cErr != nil { 286 return 0, cErr 287 } 288 289 res, err = client.HIncrByFloat(ctx, key, field, inrc).Result() 290 return res, err 291 } 292 293 //MHIncrByFloatReq MHIncrByReq float版 294 type MHIncrByFloatReq struct { 295 Key string 296 Field string 297 Inrc float64 298 } 299 300 //MHIncrByFloatWithBatch HIncrByWithBatch float版 301 func (c *Client) MHIncrByFloatWithBatch(ctx context.Context, reqs []*MHIncrByFloatReq) (res float64, err error) { 302 client, cErr := getClusterClient(c) 303 304 if cErr != nil { 305 return 0, cErr 306 } 307 308 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 309 for _, r := range reqs { 310 pipe.HIncrByFloat(ctx, r.Key, r.Field, r.Inrc) 311 } 312 return nil 313 }) 314 315 if err != nil { 316 return 0, err 317 } 318 319 res = 0 320 err = nil 321 for _, cmd := range cmds { 322 res, err = cmd.(*redis.FloatCmd).Result() 323 if err != nil { 324 break 325 } 326 } 327 328 return res, err 329 } 330 331 //HExists 判断field是否存在 332 func (c *Client) HExists(ctx context.Context, key string, field string) (res bool, err error) { 333 client, cErr := getClusterClient(c) 334 335 if cErr != nil { 336 return false, cErr 337 } 338 339 res, err = client.HExists(ctx, key, field).Result() 340 return res, err 341 }