70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
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),
|
|
}
|
|
}
|