gitee.com/h79/goutils@v1.22.10/dao/redis/pool/zset.go (about) 1 package pool 2 3 import ( 4 "context" 5 "github.com/go-redis/redis/v8" 6 ) 7 8 //Z sorted set Strut 9 type Z struct { 10 Score float64 11 Member interface{} 12 } 13 14 //ZAdd 添加sorted set 15 func (c *Client) ZAdd(ctx context.Context, key string, member ...Z) (int64, error) { 16 client, cErr := getClusterClient(c) 17 18 if cErr != nil { 19 return 0, cErr 20 } 21 22 ms := make([]*redis.Z, 0) 23 for _, m := range member { 24 ms = append(ms, &redis.Z{ 25 Score: m.Score, 26 Member: m.Member, 27 }) 28 } 29 res, err := client.ZAdd(ctx, key, ms...).Result() 30 return res, err 31 } 32 33 //MZAddReq 批量插入有序集 参数 34 type MZAddReq struct { 35 Key string 36 Members []*Z 37 } 38 39 //MZAdd 添加sorted set 40 func (c *Client) MZAdd(ctx context.Context, reqs []*MZAddReq) (int64, error) { 41 client, cErr := getClusterClient(c) 42 43 if cErr != nil { 44 return 0, cErr 45 } 46 47 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 48 for _, r := range reqs { 49 ms := make([]*redis.Z, 0) 50 for _, m := range r.Members { 51 ms = append(ms, &redis.Z{ 52 Score: m.Score, 53 Member: m.Member, 54 }) 55 } 56 pipe.ZAdd(ctx, r.Key, ms...) 57 } 58 return nil 59 }) 60 61 if err != nil { 62 return 0, err 63 } 64 65 var res int64 66 err = nil 67 for _, cmd := range cmds { 68 res, err = cmd.(*redis.IntCmd).Result() 69 if err != nil { 70 break 71 } 72 } 73 74 return res, err 75 } 76 77 //ZCard 返回有序集 key 的基数。 78 func (c *Client) ZCard(ctx context.Context, key string) (int64, error) { 79 client, cErr := getClusterClient(c) 80 81 if cErr != nil { 82 return 0, cErr 83 } 84 85 res, err := client.ZCard(ctx, key).Result() 86 return res, err 87 } 88 89 //ZCount 返回score在min, max 中的数量 ,默认闭区间开一在min和max前添加 ( 来使用开区间,min 和 max 可以是 -inf 和 +inf 90 func (c *Client) ZCount(ctx context.Context, key, min, max string) (int64, error) { 91 client, cErr := getClusterClient(c) 92 93 if cErr != nil { 94 return 0, cErr 95 } 96 97 res, err := client.ZCount(ctx, key, min, max).Result() 98 99 return res, err 100 } 101 102 //ZRange 返回有序集 key 中,指定区间内的成员,从小到大, 103 //下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 104 //你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 105 func (c *Client) ZRange(ctx context.Context, key string, start, stop int64) ([]string, error) { 106 client, cErr := getClusterClient(c) 107 108 if cErr != nil { 109 return nil, cErr 110 } 111 112 res, err := client.ZRange(ctx, key, start, stop).Result() 113 114 return res, err 115 } 116 117 //ZRevRange 返回有序集 key 中,指定区间内的成员,从大到小 118 //下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 119 //你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 120 func (c *Client) ZRevRange(ctx context.Context, key string, start, stop int64) ([]string, error) { 121 client, cErr := getClusterClient(c) 122 123 if cErr != nil { 124 return nil, cErr 125 } 126 127 res, err := client.ZRevRange(ctx, key, start, stop).Result() 128 129 return res, err 130 } 131 132 //ZRangeWithScores 返回有序集 key 中,指定区间内的成员(带score), 从小到大 133 func (c *Client) ZRangeWithScores(ctx context.Context, key string, start, stop int64) ([]*Z, error) { 134 client, cErr := getClusterClient(c) 135 136 if cErr != nil { 137 return nil, cErr 138 } 139 140 tmp, err := client.ZRangeWithScores(ctx, key, start, stop).Result() 141 142 res := make([]*Z, 0) 143 for _, t := range tmp { 144 res = append(res, &Z{ 145 Score: t.Score, 146 Member: t.Member, 147 }) 148 } 149 150 return res, err 151 } 152 153 //ZRevRangeWithScores 返回有序集 key 中,指定区间内的成员(带score), 从大到小 154 func (c *Client) ZRevRangeWithScores(ctx context.Context, key string, start, stop int64) ([]*Z, error) { 155 client, cErr := getClusterClient(c) 156 157 if cErr != nil { 158 return nil, cErr 159 } 160 161 tmp, err := client.ZRevRangeWithScores(ctx, key, start, stop).Result() 162 163 res := make([]*Z, 0) 164 for _, t := range tmp { 165 res = append(res, &Z{ 166 Score: t.Score, 167 Member: t.Member, 168 }) 169 } 170 171 return res, err 172 } 173 174 //ZRangeByScore 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 175 func (c *Client) ZRangeByScore(ctx context.Context, key, min, max string, offset, count int64) ([]string, error) { 176 client, cErr := getClusterClient(c) 177 178 if cErr != nil { 179 return nil, cErr 180 } 181 182 res, err := client.ZRangeByScore(ctx, key, &redis.ZRangeBy{ 183 Max: max, 184 Min: min, 185 Offset: offset, 186 Count: count, 187 }).Result() 188 189 return res, err 190 } 191 192 //ZRevRangeByScore 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 193 func (c *Client) ZRevRangeByScore(ctx context.Context, key, min, max string, offset, count int64) ([]string, error) { 194 client, cErr := getClusterClient(c) 195 196 if cErr != nil { 197 return nil, cErr 198 } 199 200 res, err := client.ZRevRangeByScore(ctx, key, &redis.ZRangeBy{ 201 Max: max, 202 Min: min, 203 Offset: offset, 204 Count: count, 205 }).Result() 206 207 return res, err 208 } 209 210 //ZRangeByScoreWithScores 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列(带score)。 211 func (c *Client) ZRangeByScoreWithScores(ctx context.Context, key, min, max string, offset, count int64) ([]*Z, error) { 212 client, cErr := getClusterClient(c) 213 214 if cErr != nil { 215 return nil, cErr 216 } 217 218 tmp, err := client.ZRangeByScoreWithScores(ctx, key, &redis.ZRangeBy{ 219 Max: max, 220 Min: min, 221 Offset: offset, 222 Count: count, 223 }).Result() 224 225 res := make([]*Z, 0) 226 for _, t := range tmp { 227 res = append(res, &Z{ 228 Score: t.Score, 229 Member: t.Member, 230 }) 231 } 232 233 return res, err 234 } 235 236 //ZRevRangeByScoreWithScores 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列(带score)。 237 func (c *Client) ZRevRangeByScoreWithScores(ctx context.Context, key, min, max string, offset, count int64) ([]*Z, error) { 238 client, cErr := getClusterClient(c) 239 240 if cErr != nil { 241 return nil, cErr 242 } 243 244 tmp, err := client.ZRevRangeByScoreWithScores(ctx, key, &redis.ZRangeBy{ 245 Max: max, 246 Min: min, 247 Offset: offset, 248 Count: count, 249 }).Result() 250 251 res := make([]*Z, 0) 252 for _, t := range tmp { 253 res = append(res, &Z{ 254 Score: t.Score, 255 Member: t.Member, 256 }) 257 } 258 259 return res, err 260 } 261 262 //ZRem 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略 263 func (c *Client) ZRem(ctx context.Context, key string, members ...interface{}) (int64, error) { 264 client, cErr := getClusterClient(c) 265 266 if cErr != nil { 267 return 0, cErr 268 } 269 270 res, err := client.ZRem(ctx, key, members...).Result() 271 272 return res, err 273 } 274 275 //MZRemReq 批量移除有序集参数 276 type MZRemReq struct { 277 Key string 278 Members []interface{} 279 } 280 281 //MZRem 移除多个序集 key 中的一个或多个成员,不存在的成员将被忽略 282 func (c *Client) MZRem(ctx context.Context, reqs []*MZRemReq) (int64, error) { 283 client, cErr := getClusterClient(c) 284 285 if cErr != nil { 286 return 0, cErr 287 } 288 289 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 290 for _, r := range reqs { 291 pipe.ZRem(ctx, r.Key, r.Members...) 292 } 293 return nil 294 }) 295 296 if err != nil { 297 return 0, err 298 } 299 300 var res int64 301 err = nil 302 for _, cmd := range cmds { 303 res, err = cmd.(*redis.IntCmd).Result() 304 if err != nil { 305 break 306 } 307 } 308 309 return res, err 310 } 311 312 //ZRemRangeByRank 移除有序集 key 中,指定排名(rank)区间内的所有成员 313 func (c *Client) ZRemRangeByRank(ctx context.Context, key string, start, stop int64) (int64, error) { 314 client, cErr := getClusterClient(c) 315 316 if cErr != nil { 317 return 0, cErr 318 } 319 320 res, err := client.ZRemRangeByRank(ctx, key, start, stop).Result() 321 322 return res, err 323 } 324 325 //MZRemRangeByRankReq 按照排序批量移除多个有序集成员的参数 326 type MZRemRangeByRankReq struct { 327 Key string 328 Start, Stop int64 329 } 330 331 //MZRemRangeByRank 按照排序批量移除多个有序集成员 332 func (c *Client) MZRemRangeByRank(ctx context.Context, reqs []*MZRemRangeByRankReq) (int64, error) { 333 client, cErr := getClusterClient(c) 334 335 if cErr != nil { 336 return 0, cErr 337 } 338 339 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 340 for _, r := range reqs { 341 pipe.ZRemRangeByRank(ctx, r.Key, r.Start, r.Stop) 342 } 343 return nil 344 }) 345 346 if err != nil { 347 return 0, err 348 } 349 350 var res int64 351 err = nil 352 for _, cmd := range cmds { 353 res, err = cmd.(*redis.IntCmd).Result() 354 if err != nil { 355 break 356 } 357 } 358 359 return res, err 360 } 361 362 //ZRemRangeByScore 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 363 func (c *Client) ZRemRangeByScore(ctx context.Context, key string, min, max string) (int64, error) { 364 client, cErr := getClusterClient(c) 365 366 if cErr != nil { 367 return 0, cErr 368 } 369 370 res, err := client.ZRemRangeByScore(ctx, key, min, max).Result() 371 372 return res, err 373 } 374 375 //MZRemRangeByScoreReq 按照score,批量移除多个有序集成员参数, 376 type MZRemRangeByScoreReq struct { 377 Key string 378 Min, Max string 379 } 380 381 //MZRemRangeByScore 按照score,批量移除多个有序集成员 382 func (c *Client) MZRemRangeByScore(ctx context.Context, reqs []*MZRemRangeByScoreReq) (int64, error) { 383 client, cErr := getClusterClient(c) 384 385 if cErr != nil { 386 return 0, cErr 387 } 388 389 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 390 for _, r := range reqs { 391 pipe.ZRemRangeByScore(ctx, r.Key, r.Min, r.Max) 392 } 393 return nil 394 }) 395 396 if err != nil { 397 return 0, err 398 } 399 400 var res int64 401 err = nil 402 for _, cmd := range cmds { 403 res, err = cmd.(*redis.IntCmd).Result() 404 if err != nil { 405 break 406 } 407 } 408 409 return res, err 410 } 411 412 //ZIncrBy 为有序集 key 的成员 member 的 score 值加上增量 increment 413 func (c *Client) ZIncrBy(ctx context.Context, key string, increment float64, member string) (float64, error) { 414 client, cErr := getClusterClient(c) 415 416 if cErr != nil { 417 return 0, cErr 418 } 419 420 return client.ZIncrBy(ctx, key, increment, member).Result() 421 } 422 423 //MZIncrByReq 批量为有序集 key 的成员 member 的 score 值加上增量 increment 参数 424 type MZIncrByReq struct { 425 Key string 426 Increment float64 427 Member string 428 } 429 430 //MZIncrBy 批量为有序集 key 的成员 member 的 score 值加上增量 increment 431 func (c *Client) MZIncrBy(ctx context.Context, reqs []*MZIncrByReq) (float64, error) { 432 client, cErr := getClusterClient(c) 433 434 if cErr != nil { 435 return 0, cErr 436 } 437 438 cmds, err := client.Pipelined(ctx, func(pipe redis.Pipeliner) error { 439 for _, r := range reqs { 440 pipe.ZIncrBy(ctx, r.Key, r.Increment, r.Member) 441 } 442 return nil 443 }) 444 445 if err != nil { 446 return 0, err 447 } 448 449 var res float64 450 err = nil 451 for _, cmd := range cmds { 452 res, err = cmd.(*redis.FloatCmd).Result() 453 if err != nil { 454 break 455 } 456 } 457 458 return res, err 459 } 460 461 //ZScore 返回有序集 key 中,成员 member 的 score 值。 462 func (c *Client) ZScore(ctx context.Context, key, member string) (float64, error) { 463 client, cErr := getClusterClient(c) 464 465 if cErr != nil { 466 return 0, cErr 467 } 468 return client.ZScore(ctx, key, member).Result() 469 }