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  }