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  }