package cache import ( "fmt" "time" ) var c Cache type Cache interface { // get cached value by key. Get(key string) interface{} // GetMulti is a batch version of Get. GetMulti(keys []string) []interface{} // set cached value with key and expire time. Put(key string, val interface{}, timeout time.Duration) error // delete cached value by key. Delete(key string) error // increase cached int value by key, as a counter. Incr(key string) error // decrease cached int value by key, as a counter. Decr(key string) error // check if cached value exists or not. IsExist(key string) bool // clear all cache. ClearAll() error // start gc routine based on config string settings. StartAndGC(config string) error } // Instance is a function create a new Cache Instance type Instance func() Cache var adapters = make(map[string]Instance) // Register makes a cache adapter available by the adapter name. // If Register is called twice with the same name or if driver is nil, // it panics. func Register(name string, adapter Instance) { if adapter == nil { panic("cache: Register adapter is nil") } if _, ok := adapters[name]; ok { panic("cache: Register called twice for adapter " + name) } adapters[name] = adapter } // NewCache Create a new cache driver by adapter name and config string. // config need to be correct JSON as string: {"interval":360}. // it will start gc automatically. func NewCache(adapterName, config string) (adapter Cache, err error) { instanceFunc, ok := adapters[adapterName] if !ok { err = fmt.Errorf("cache: unknown adapter name %q (forgot to import?)", adapterName) return } adapter = instanceFunc() err = adapter.StartAndGC(config) if err != nil { adapter = nil } return } func InitCache(adapterName, config string) (err error) { instanceFunc, ok := adapters[adapterName] if !ok { err = fmt.Errorf("cache: unknown adapter name %q (forgot to import?)", adapterName) return } c = instanceFunc() err = c.StartAndGC(config) if err != nil { c = nil } return } func Get(key string) interface{} { return c.Get(key) } func GetMulti(keys []string) []interface{} { return c.GetMulti(keys) } func Put(key string, val interface{}, ttl time.Duration) error { return c.Put(key, val, ttl) } func Delete(key string) error { return c.Delete(key) } func Incr(key string) error { return c.Incr(key) } func Decr(key string) error { return c.Decr(key) } func IsExist(key string) bool { return c.IsExist(key) } func ClearAll() error { return c.ClearAll() } func StartAndGC(cfg string) error { return c.StartAndGC(cfg) }