Files
cache/memcached/memcached.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 any) {
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 any, 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]any {
keys = c.BuildKeys(keys)
items, err := c.client.GetMulti(keys)
if err != nil {
return nil
}
values := make(map[string]any, len(keys))
for key, item := range items {
var val any
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]any, 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
}