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 }