|
|
|
@ -0,0 +1,57 @@
|
|
|
|
|
package gocache
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"github.com/bradfitz/gomemcache/memcache"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// MemcachedCache https://github.com/bradfitz/gomemcache
|
|
|
|
|
type MemcachedCache struct {
|
|
|
|
|
db *Memcached // 驱动
|
|
|
|
|
GetterString GttStringFunc // 不存在的操作
|
|
|
|
|
GetterInterface GttInterfaceFunc // 不存在的操作
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NewCache 实例化
|
|
|
|
|
func (m *Memcached) NewCache() *MemcachedCache {
|
|
|
|
|
return &MemcachedCache{db: m}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetString 缓存操作
|
|
|
|
|
func (mc *MemcachedCache) GetString(key string) (ret string) {
|
|
|
|
|
|
|
|
|
|
f := func() string {
|
|
|
|
|
return mc.GetterString()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果不存在,则调用GetterString
|
|
|
|
|
ret, err := mc.db.Get(key)
|
|
|
|
|
|
|
|
|
|
if err == memcache.ErrCacheMiss {
|
|
|
|
|
mc.db.Set(key, []byte(f()))
|
|
|
|
|
ret, _ = mc.db.Get(key)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetInterface 缓存操作
|
|
|
|
|
func (mc *MemcachedCache) GetInterface(key string, result interface{}) {
|
|
|
|
|
|
|
|
|
|
f := func() string {
|
|
|
|
|
marshal, _ := json.Marshal(mc.GetterInterface())
|
|
|
|
|
return string(marshal)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果不存在,则调用GetterInterface
|
|
|
|
|
get, err := mc.db.Get(key)
|
|
|
|
|
|
|
|
|
|
if err == memcache.ErrCacheMiss {
|
|
|
|
|
mc.db.Set(key, []byte(f()))
|
|
|
|
|
get, _ = mc.db.Get(key)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = json.Unmarshal([]byte(get), result)
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|