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  }