// Copyright 2014 beego Author. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package cache provide a Cache interface and some implement engine // Usage: // // import( // "github.com/beego/beego/v2/client/cache" // ) // // bm, err := cache.NewCache("memory", `{"interval":60}`) // // Use it like this: // // bm.Put("astaxie", 1, 10 * time.Second) // bm.Get("astaxie") // bm.IsExist("astaxie") // bm.Delete("astaxie") // // more docs http://beego.vip/docs/module/cache.md package cache import ( "context" "time" "github.com/beego/beego/v2/core/berror" ) // Cache interface contains all behaviors for cache adapter. // usage: // cache.Register("file",cache.NewFileCache) // this operation is run in init method of file.go. // c,err := cache.NewCache("file","{....}") // c.Put("key",value, 3600 * time.Second) // v := c.Get("key") // // c.Incr("counter") // now is 1 // c.Incr("counter") // now is 2 // count := c.Get("counter").(int) type Cache interface { // Get a cached value by key. Get(ctx context.Context, key string) (interface{}, error) // GetMulti is a batch version of Get. GetMulti(ctx context.Context, keys []string) ([]interface{}, error) // Put Set a cached value with key and expire time. Put(ctx context.Context, key string, val interface{}, timeout time.Duration) error // Delete cached value by key. // Should not return error if key not found Delete(ctx context.Context, key string) error // Incr Increment a cached int value by key, as a counter. Incr(ctx context.Context, key string) error // Decr Decrement a cached int value by key, as a counter. Decr(ctx context.Context, key string) error // IsExist Check if a cached value exists or not. // if key is expired, return (false, nil) IsExist(ctx context.Context, key string) (bool, error) // ClearAll Clear all cache. ClearAll(ctx context.Context) error // StartAndGC 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(berror.Error(NilCacheAdapter, "cache: Register adapter is nil").Error()) } if _, ok := adapters[name]; ok { panic("cache: Register called twice for adapter " + name) } adapters[name] = adapter } // NewCache creates a new cache driver by adapter name and config string. // config: must be in JSON format such as {"interval":360}. // Starts gc automatically. func NewCache(adapterName, config string) (adapter Cache, err error) { instanceFunc, ok := adapters[adapterName] if !ok { err = berror.Errorf(UnknownAdapter, "cache: unknown adapter name %s (forgot to import?)", adapterName) return } adapter = instanceFunc() err = adapter.StartAndGC(config) if err != nil { adapter = nil } return }