kos/pkg/cache/memcache.go

70 lines
1.5 KiB
Go
Raw Normal View History

2023-04-23 17:57:36 +08:00
package cache
import (
"context"
2023-06-30 14:16:16 +08:00
"git.nspix.com/golang/kos/util/env"
2023-04-23 17:57:36 +08:00
"github.com/patrickmn/go-cache"
2023-06-30 14:16:16 +08:00
"os"
2023-04-23 17:57:36 +08:00
"time"
)
2023-06-30 14:16:16 +08:00
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
}
}
2023-04-23 17:57:36 +08:00
type MemCache struct {
engine *cache.Cache
}
2023-06-30 14:16:16 +08:00
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
}
2023-04-23 17:57:36 +08:00
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{
2023-06-30 14:16:16 +08:00
engine: cache.New(memCacheDefaultExpired, memCacheCleanupInterval),
2023-04-23 17:57:36 +08:00
}
}