github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/cache/memcache/memcache.go (about) 1 package memcache 2 3 import ( 4 "fmt" 5 "strconv" 6 "time" 7 8 "github.com/bradfitz/gomemcache/memcache" 9 "github.com/sereiner/library/cache" 10 ) 11 12 // memcacheClient memcache配置文件 13 type memcacheClient struct { 14 servers []string 15 client *memcache.Client 16 } 17 18 // New 根据配置文件创建一个memcache连接 19 func New(addrs []string) (m *memcacheClient, err error) { 20 m = &memcacheClient{servers: addrs} 21 m.client = memcache.New(addrs...) 22 m.client.Timeout = time.Second 23 return 24 } 25 26 // Get 根据key获取memcache中的数据 27 func (c *memcacheClient) Get(key string) (string, error) { 28 data, err := c.client.Get(key) 29 if err != nil { 30 return "", err 31 } 32 return string(data.Value), nil 33 } 34 35 //Decrement 增加变量的值 36 func (c *memcacheClient) Decrement(key string, delta int64) (n int64, err error) { 37 value, err := strconv.ParseUint(fmt.Sprintf("%d", delta), 10, 64) 38 if err != nil { 39 return 0, err 40 } 41 v, err := c.client.Decrement(key, value) 42 if err != nil { 43 return 44 } 45 n, err = strconv.ParseInt(fmt.Sprintf("%d", v), 10, 64) 46 if err != nil { 47 return 0, err 48 } 49 return 50 } 51 52 //Increment 减少变量的值 53 func (c *memcacheClient) Increment(key string, delta int64) (n int64, err error) { 54 value, err := strconv.ParseUint(fmt.Sprintf("%d", delta), 10, 64) 55 if err != nil { 56 return 0, err 57 } 58 v, err := c.client.Increment(key, value) 59 if err != nil { 60 return 61 } 62 n, err = strconv.ParseInt(fmt.Sprintf("%d", v), 10, 64) 63 if err != nil { 64 return 0, err 65 } 66 return 67 } 68 69 //Gets 获取多条数据 70 func (c *memcacheClient) Gets(key ...string) (r []string, err error) { 71 data, err := c.client.GetMulti(key) 72 if err != nil { 73 return nil, err 74 } 75 r = make([]string, len(data)) 76 for _, v := range key { 77 r = append(r, string(data[v].Value)) 78 } 79 return 80 } 81 82 // Add 添加数据到memcache中,如果memcache存在,则报错 83 func (c *memcacheClient) Add(key string, value string, expiresAt int) error { 84 expires := time.Now().Add(time.Duration(expiresAt) * time.Second).Unix() 85 if expiresAt == 0 { 86 expires = 0 87 } 88 data := &memcache.Item{Key: key, Value: []byte(value), Expiration: int32(expires)} 89 return c.client.Add(data) 90 } 91 92 // Set 更新数据到memcache中,没有则添加 93 func (c *memcacheClient) Set(key string, value string, expiresAt int) error { 94 expires := time.Now().Add(time.Duration(expiresAt) * time.Second).Unix() 95 if expiresAt == 0 { 96 expires = 0 97 } 98 data := &memcache.Item{Key: key, Value: []byte(value), Expiration: int32(expires)} 99 err := c.client.Set(data) 100 return err 101 } 102 103 // Delete 删除memcache中的数据 104 func (c *memcacheClient) Delete(key string) error { 105 106 return c.client.Delete(key) 107 } 108 func (c *memcacheClient) Exists(key string) bool { 109 i, err := c.client.Get(key) 110 return err == nil && len(i.Value) > 0 111 } 112 113 // Delay 延长数据在memcache中的时间 114 func (c *memcacheClient) Delay(key string, expiresAt int) error { 115 return c.client.Touch(key, int32(expiresAt)) 116 } 117 118 // DeleteAll 删除所有缓存数据 119 func (c *memcacheClient) DeleteAll() error { 120 return c.client.DeleteAll() 121 } 122 func (c *memcacheClient) Close() error { 123 return nil 124 } 125 126 type memcacheResolver struct { 127 } 128 129 func (s *memcacheResolver) Resolve(address []string, c string) (cache.ICache, error) { 130 return New(address) 131 } 132 func init() { 133 cache.Register("memcached", &memcacheResolver{}) 134 }