package cache import ( "context" "git.nspix.com/golang/kos/util/env" "github.com/patrickmn/go-cache" "os" "time" ) var ( memCacheDefaultExpired time.Duration memCacheCleanupInterval time.Duration ) func init() { memCacheDefaultExpired, _ = time.ParseDuration(env.Get("MEMCACHE_DEFAULT_EXPIRED", "1h")) memCacheCleanupInterval, _ = time.ParseDuration(env.Get("MEMCACHE_CLEANUP_INTERVAL", "10m")) if memCacheDefaultExpired < time.Second*5 { memCacheDefaultExpired = time.Second * 5 } if memCacheCleanupInterval < time.Minute { memCacheCleanupInterval = time.Minute } } type MemCache struct { engine *cache.Cache } func (cache *MemCache) Try(ctx context.Context, key string, cb LoadFunc) (value any, err error) { var ( ok bool ) if value, ok = cache.engine.Get(key); ok { return value, nil } if cb == nil { return nil, os.ErrNotExist } if value, err = cb(ctx); err == nil { cache.engine.Set(key, value, 0) } return } func (cache *MemCache) Set(ctx context.Context, key string, value any) { cache.engine.Set(key, value, 0) } func (cache *MemCache) SetEx(ctx context.Context, key string, value any, expire time.Duration) { cache.engine.Set(key, value, expire) } func (cache *MemCache) Get(ctx context.Context, key string) (value any, ok bool) { return cache.engine.Get(key) } func (cache *MemCache) Del(ctx context.Context, key string) { cache.engine.Delete(key) } func NewMemCache() *MemCache { return &MemCache{ engine: cache.New(memCacheDefaultExpired, memCacheCleanupInterval), } }