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  }