github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/cache/redis/redis.go (about)

     1  package redis
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"time"
     7  
     8  	"github.com/sereiner/library/cache"
     9  	"github.com/sereiner/library/redis"
    10  )
    11  
    12  // redisClient redis配置文件
    13  type redisClient struct {
    14  	servers []string
    15  	client  *redis.Client
    16  }
    17  
    18  // New 根据配置文件创建一个redis连接
    19  func New(addrs []string, conf string) (m *redisClient, err error) {
    20  	m = &redisClient{servers: addrs}
    21  	m.client, err = redis.NewClientByJSON(conf)
    22  	if err != nil {
    23  		return
    24  	}
    25  	return
    26  }
    27  
    28  // Get 根据key获取redis中的数据
    29  func (c *redisClient) Get(key string) (string, error) {
    30  	data, err := c.client.Get(key).Result()
    31  	if err != nil {
    32  		if err.Error() == "redis: nil" {
    33  			return data, nil
    34  		}
    35  		return "", err
    36  	}
    37  	return data, nil
    38  }
    39  
    40  //Decrement 增加变量的值
    41  func (c *redisClient) Decrement(key string, delta int64) (n int64, err error) {
    42  	return c.client.DecrBy(key, delta).Result()
    43  }
    44  
    45  //Increment 减少变量的值
    46  func (c *redisClient) Increment(key string, delta int64) (n int64, err error) {
    47  	return c.client.IncrBy(key, delta).Result()
    48  }
    49  
    50  //Gets 获取多条数据
    51  func (c *redisClient) Gets(key ...string) (r []string, err error) {
    52  	data, err := c.client.MGet(key...).Result()
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  	r = make([]string, 0, len(data))
    57  	for _, v := range data {
    58  		if v == nil || v.(string) == "" {
    59  			continue
    60  		}
    61  		r = append(r, v.(string))
    62  	}
    63  	return
    64  }
    65  
    66  // Add 添加数据到redis中,如果redis存在,则报错
    67  func (c *redisClient) Add(key string, value string, expiresAt int) error {
    68  	expires := time.Duration(expiresAt) * time.Second
    69  	if expiresAt == 0 {
    70  		expires = 0
    71  	}
    72  	i, err := c.client.Exists(key).Result()
    73  	if err != nil {
    74  		return err
    75  	}
    76  	if i == 1 {
    77  		err = fmt.Errorf("key:%s已存在", key)
    78  		return err
    79  	}
    80  	_, err = c.client.Set(key, value, expires).Result()
    81  	return err
    82  }
    83  
    84  // Set 更新数据到redis中,没有则添加
    85  func (c *redisClient) Set(key string, value string, expiresAt int) error {
    86  	expires := time.Duration(expiresAt) * time.Second
    87  	if expiresAt == 0 {
    88  		expires = 0
    89  	}
    90  	_, err := c.client.Set(key, value, expires).Result()
    91  	return err
    92  }
    93  
    94  func (c *redisClient) Delete(key string) error {
    95  	if !strings.Contains(key, "*") {
    96  		_, err := c.client.Del(key).Result()
    97  		if err != nil {
    98  			return fmt.Errorf("%v(%s)", err, key)
    99  		}
   100  		return nil
   101  	}
   102  	_, err := c.client.Eval(`
   103      local keys=redis.call('KEYS',KEYS[1])
   104      if (#keys==0) then
   105          return 0
   106      end
   107  		return redis.call('DEL',unpack(keys))`, []string{key}).Result()
   108  	return err
   109  }
   110  
   111  // Delete 删除redis中的数据
   112  func (c *redisClient) Exists(key string) bool {
   113  	r, err := c.client.Exists(key).Result()
   114  	return err == nil && r == 1
   115  }
   116  
   117  // Delay 延长数据在redis中的时间
   118  func (c *redisClient) Delay(key string, expiresAt int) error {
   119  	expires := time.Duration(expiresAt) * time.Second
   120  	if expiresAt == 0 {
   121  		expires = 0
   122  	}
   123  	_, err := c.client.Expire(key, expires).Result()
   124  	return err
   125  }
   126  func (c *redisClient) Close() error {
   127  	return c.client.Close()
   128  }
   129  
   130  type redisResolver struct {
   131  }
   132  
   133  func (s *redisResolver) Resolve(address []string, conf string) (cache.ICache, error) {
   134  	return New(address, conf)
   135  }
   136  func init() {
   137  	cache.Register("redis", &redisResolver{})
   138  }