gitee.com/h79/goutils@v1.22.10/dao/redis/pool/list.go (about) 1 package pool 2 3 import ( 4 "context" 5 "time" 6 7 "github.com/go-redis/redis/v8" 8 ) 9 10 //LPush 把value 插到表头 11 func (c *Client) LPush(ctx context.Context, expiration time.Duration, key string, value ...interface{}) (res int64, err error) { 12 client, cErr := getClusterClient(c) 13 14 if cErr != nil { 15 return 0, cErr 16 } 17 18 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 19 pipe.LPush(ctx, key, value...) 20 if expiration != 0 { 21 pipe.Expire(ctx, key, expiration) 22 } 23 return nil 24 }) 25 26 // res, err := client.LPush(key, value...).Result() 27 28 if err != nil { 29 return 0, err 30 } 31 32 err = nil 33 34 for _, cmd := range cmds { 35 if cmd.Name() == "lpush" { 36 res, err = cmd.(*redis.IntCmd).Result() 37 } else { 38 _, err = cmd.(*redis.BoolCmd).Result() 39 } 40 } 41 return res, err 42 } 43 44 //RPush 把value 插到表头 45 func (c *Client) RPush(ctx context.Context, expiration time.Duration, key string, value ...interface{}) (res int64, err error) { 46 client, cErr := getClusterClient(c) 47 48 if cErr != nil { 49 return 0, cErr 50 } 51 52 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 53 pipe.RPush(ctx, key, value...) 54 if expiration != 0 { 55 pipe.Expire(ctx, key, expiration) 56 } 57 return nil 58 }) 59 60 // res, err := client.LPush(key, value...).Result() 61 62 if err != nil { 63 return 0, err 64 } 65 66 err = nil 67 68 for _, cmd := range cmds { 69 if cmd.Name() == "rpush" { 70 res, err = cmd.(*redis.IntCmd).Result() 71 } else { 72 _, err = cmd.(*redis.BoolCmd).Result() 73 } 74 } 75 return res, err 76 } 77 78 //MLPushReq 批量 LPush 参数 79 type MLPushReq struct { 80 Key string 81 Value []interface{} 82 Expiration time.Duration 83 } 84 85 type MRPushReq MLPushReq 86 87 //MLPush 批量 LPush 88 func (c *Client) MLPush(ctx context.Context, reqs []*MLPushReq) (res int64, err error) { 89 client, cErr := getClusterClient(c) 90 91 if cErr != nil { 92 return 0, cErr 93 } 94 95 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 96 for _, r := range reqs { 97 pipe.LPush(ctx, r.Key, r.Value...) 98 if r.Expiration != 0 { 99 pipe.Expire(ctx, r.Key, r.Expiration) 100 } 101 } 102 return nil 103 }) 104 105 if err != nil { 106 return 0, err 107 } 108 109 err = nil 110 for _, cmd := range cmds { 111 if cmd.Name() == "lpush" { 112 res, err = cmd.(*redis.IntCmd).Result() 113 } else { 114 _, err = cmd.(*redis.BoolCmd).Result() 115 } 116 117 if err != nil { 118 break 119 } 120 } 121 122 return res, err 123 } 124 125 //MRPush 批量 RPush 126 func (c *Client) MRPush(ctx context.Context, reqs []*MRPushReq) (res int64, err error) { 127 client, cErr := getClusterClient(c) 128 129 if cErr != nil { 130 return 0, cErr 131 } 132 133 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 134 for _, r := range reqs { 135 pipe.RPush(ctx, r.Key, r.Value...) 136 if r.Expiration != 0 { 137 pipe.Expire(ctx, r.Key, r.Expiration) 138 } 139 } 140 return nil 141 }) 142 143 if err != nil { 144 return 0, err 145 } 146 147 err = nil 148 for _, cmd := range cmds { 149 if cmd.Name() == "rpush" { 150 res, err = cmd.(*redis.IntCmd).Result() 151 } else { 152 _, err = cmd.(*redis.BoolCmd).Result() 153 } 154 155 if err != nil { 156 break 157 } 158 } 159 160 return res, err 161 } 162 163 //LPop 弹出表头 164 func (c *Client) LPop(ctx context.Context, key string) (string, error) { 165 client, cErr := getClusterClient(c) 166 167 if cErr != nil { 168 return "", cErr 169 } 170 171 res, err := client.LPop(ctx, key).Result() 172 173 return res, err 174 } 175 176 //MLPop 批量弹出表头 177 func (c *Client) MLPop(ctx context.Context, keys ...string) (res string, err error) { 178 client, cErr := getClusterClient(c) 179 180 if cErr != nil { 181 return "", cErr 182 } 183 184 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 185 for _, k := range keys { 186 pipe.LPop(ctx, k) 187 } 188 return nil 189 }) 190 191 if err != nil { 192 return "", err 193 } 194 195 err = nil 196 for _, cmd := range cmds { 197 res, err = cmd.(*redis.StringCmd).Result() 198 if err != nil { 199 break 200 } 201 } 202 203 return res, err 204 } 205 206 //RPop 弹出表尾 207 func (c *Client) RPop(ctx context.Context, key string) (string, error) { 208 client, cErr := getClusterClient(c) 209 210 if cErr != nil { 211 return "", cErr 212 } 213 214 res, err := client.RPop(ctx, key).Result() 215 216 return res, err 217 } 218 219 //MRPop 批量弹出表尾 220 func (c *Client) MRPop(ctx context.Context, keys ...string) (res string, err error) { 221 client, cErr := getClusterClient(c) 222 223 if cErr != nil { 224 return "", cErr 225 } 226 227 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 228 for _, k := range keys { 229 pipe.RPop(ctx, k) 230 } 231 return nil 232 }) 233 234 if err != nil { 235 return "", err 236 } 237 238 err = nil 239 for _, cmd := range cmds { 240 res, err = cmd.(*redis.StringCmd).Result() 241 if err != nil { 242 break 243 } 244 } 245 246 return res, err 247 } 248 249 //LInsert 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 250 func (c *Client) LInsert(ctx context.Context, key, op string, pivot, value interface{}) (int64, error) { 251 client, cErr := getClusterClient(c) 252 253 if cErr != nil { 254 return 0, cErr 255 } 256 257 res, err := client.LInsert(ctx, key, op, pivot, value).Result() 258 259 return res, err 260 } 261 262 //MLInsertReq 批量 LInsert参数 263 type MLInsertReq struct { 264 Key string 265 Op string 266 Pivot interface{} 267 Value interface{} 268 } 269 270 //MLInsert 批量 LInsert 271 func (c *Client) MLInsert(ctx context.Context, reqs []*MLInsertReq) (res int64, err error) { 272 client, cErr := getClusterClient(c) 273 274 if cErr != nil { 275 return 0, cErr 276 } 277 278 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 279 for _, r := range reqs { 280 pipe.LInsert(ctx, r.Key, r.Op, r.Pivot, r.Value) 281 } 282 return nil 283 }) 284 285 if err != nil { 286 return 0, err 287 } 288 289 err = nil 290 for _, cmd := range cmds { 291 res, err = cmd.(*redis.IntCmd).Result() 292 if err != nil { 293 break 294 } 295 } 296 297 return res, err 298 } 299 300 //LLen 返回表长度 301 func (c *Client) LLen(ctx context.Context, key string) (int64, error) { 302 client, cErr := getClusterClient(c) 303 304 if cErr != nil { 305 return 0, cErr 306 } 307 308 res, err := client.LLen(ctx, key).Result() 309 310 return res, err 311 } 312 313 //MLLen 返回表长度 314 func (c *Client) MLLen(ctx context.Context, keys ...string) (map[string]int64, error) { 315 client, cErr := getClusterClient(c) 316 317 if cErr != nil { 318 return nil, cErr 319 } 320 321 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 322 for _, k := range keys { 323 pipe.LLen(ctx, k) 324 } 325 return nil 326 }) 327 328 resMap := make(map[string]int64, 0) 329 330 for i, cmd := range cmds { 331 r, _ := cmd.(*redis.IntCmd).Result() 332 resMap[keys[i]] = r 333 } 334 335 // res, err := client.LLen(key).Result() 336 337 return resMap, err 338 } 339 340 //LSet 设置表中index 的值为 value 341 func (c *Client) LSet(ctx context.Context, key string, index int64, value interface{}) (string, error) { 342 client, cErr := getClusterClient(c) 343 344 if cErr != nil { 345 return "", cErr 346 } 347 348 res, err := client.LSet(ctx, key, index, value).Result() 349 350 return res, err 351 } 352 353 //MLSetReq 批量 LSet 参数 354 type MLSetReq struct { 355 Key string 356 Index int64 357 Value interface{} 358 } 359 360 //MLSet 批量 LSet 361 func (c *Client) MLSet(ctx context.Context, reqs []*MLSetReq) (res string, err error) { 362 client, cErr := getClusterClient(c) 363 364 if cErr != nil { 365 return "", cErr 366 } 367 368 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 369 for _, r := range reqs { 370 pipe.LSet(ctx, r.Key, r.Index, r.Value) 371 } 372 return nil 373 }) 374 375 if err != nil { 376 return "", err 377 } 378 379 err = nil 380 for _, cmd := range cmds { 381 res, err = cmd.(*redis.StringCmd).Result() 382 if err != nil { 383 break 384 } 385 } 386 387 return res, err 388 } 389 390 //LIndex 返回表中index的值 391 func (c *Client) LIndex(ctx context.Context, key string, index int64) (string, error) { 392 client, cErr := getClusterClient(c) 393 394 if cErr != nil { 395 return "", cErr 396 } 397 398 res, err := client.LIndex(ctx, key, index).Result() 399 400 return res, err 401 } 402 403 //LRange 随机返回index 在start和stop 一个value 404 func (c *Client) LRange(ctx context.Context, key string, start, stop int64) ([]string, error) { 405 client, cErr := getClusterClient(c) 406 407 if cErr != nil { 408 return nil, cErr 409 } 410 411 res, err := client.LRange(ctx, key, start, stop).Result() 412 413 return res, err 414 } 415 416 func (c *Client) LTrim(ctx context.Context, key string, start, stop int64) (string, error) { 417 client, cErr := getClusterClient(c) 418 419 if cErr != nil { 420 return "", cErr 421 } 422 423 res, err := client.LTrim(ctx, key, start, stop).Result() 424 425 return res, err 426 }