mirror of
https://github.com/gookit/cache.git
synced 2025-09-27 04:26:19 +08:00
142 lines
2.6 KiB
Go
142 lines
2.6 KiB
Go
// Package memcached use the "github.com/bradfitz/gomemcache/memcache" as cache driver
|
|
package memcached
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/bradfitz/gomemcache/memcache"
|
|
"github.com/gookit/cache"
|
|
)
|
|
|
|
// Name driver name
|
|
const Name = "memCached"
|
|
|
|
// MemCached definition
|
|
type MemCached struct {
|
|
cache.BaseDriver
|
|
client *memcache.Client
|
|
servers []string
|
|
}
|
|
|
|
// New a MemCached instance
|
|
func New(servers ...string) *MemCached {
|
|
return &MemCached{
|
|
servers: servers,
|
|
}
|
|
}
|
|
|
|
// Connect new a MemCached instance and connect to memcached servers.
|
|
func Connect(servers ...string) *MemCached {
|
|
c := &MemCached{
|
|
servers: servers,
|
|
}
|
|
|
|
return c.Connect()
|
|
}
|
|
|
|
// Connect to servers
|
|
func (c *MemCached) Connect() *MemCached {
|
|
c.client = memcache.New(c.servers...)
|
|
return c
|
|
}
|
|
|
|
// Has cache key
|
|
func (c *MemCached) Has(key string) bool {
|
|
_, err := c.client.Get(c.Key(key))
|
|
return err == nil
|
|
}
|
|
|
|
// Get value by key
|
|
func (c *MemCached) Get(key string) (val interface{}) {
|
|
item, err := c.client.Get(c.Key(key))
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = c.UnmarshalTo(item.Value, &val)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return
|
|
}
|
|
|
|
// Set value by key
|
|
func (c *MemCached) Set(key string, val interface{}, ttl time.Duration) (err error) {
|
|
bts, err := c.MustMarshal(val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return c.client.Set(&memcache.Item{
|
|
Key: c.Key(key),
|
|
Value: bts,
|
|
// expire time. 0 is never expired
|
|
Expiration: int32(ttl / time.Second),
|
|
})
|
|
}
|
|
|
|
// Del value by key
|
|
func (c *MemCached) Del(key string) error {
|
|
return c.client.Delete(c.Key(key))
|
|
}
|
|
|
|
// GetMulti values by multi key
|
|
func (c *MemCached) GetMulti(keys []string) map[string]interface{} {
|
|
keys = c.BuildKeys(keys)
|
|
|
|
items, err := c.client.GetMulti(keys)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
values := make(map[string]interface{}, len(keys))
|
|
for key, item := range items {
|
|
var val interface{}
|
|
if err := c.UnmarshalTo(item.Value, &val); err != nil {
|
|
continue
|
|
}
|
|
|
|
values[key] = val
|
|
}
|
|
|
|
return values
|
|
}
|
|
|
|
// SetMulti values by multi key
|
|
func (c *MemCached) SetMulti(values map[string]interface{}, ttl time.Duration) (err error) {
|
|
for key, val := range values {
|
|
if err = c.Set(c.Key(key), val, ttl); err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// DelMulti values by multi key
|
|
func (c *MemCached) DelMulti(keys []string) error {
|
|
for _, key := range c.BuildKeys(keys) {
|
|
if err := c.client.Delete(key); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Clear all caches
|
|
func (c *MemCached) Clear() error {
|
|
return c.client.DeleteAll()
|
|
}
|
|
|
|
// Close driver
|
|
func (c *MemCached) Close() error {
|
|
c.client = nil
|
|
return nil
|
|
}
|
|
|
|
// Client get
|
|
func (c *MemCached) Client() *memcache.Client {
|
|
return c.client
|
|
}
|