diff --git a/cache/cache.go b/cache/cache.go index abef179e..1e91248a 100644 --- a/cache/cache.go +++ b/cache/cache.go @@ -6,7 +6,7 @@ import ( type Cache interface { Get(key string) interface{} - Put(key string, val interface{}, timeout int) error + Put(key string, val interface{}, timeout int64) error Delete(key string) error IsExist(key string) bool ClearAll() error @@ -28,7 +28,7 @@ func Register(name string, adapter Cache) { adapters[name] = adapter } -// config need to be correct JSON as string: {"interval":360} +// config need to be correct JSON as string: {"interval":360} func NewCache(adapterName, config string) (Cache, error) { adapter, ok := adapters[adapterName] if !ok { diff --git a/cache/cache_test.go b/cache/cache_test.go index d43fe537..4183fbc0 100644 --- a/cache/cache_test.go +++ b/cache/cache_test.go @@ -6,7 +6,7 @@ import ( ) func Test_cache(t *testing.T) { - bm, err := NewCache("memory", `{"interval":60}`) + bm, err := NewCache("memory", `{"interval":20}`) if err != nil { t.Error("init err") } @@ -21,7 +21,7 @@ func Test_cache(t *testing.T) { t.Error("get err") } - time.Sleep(70 * time.Second) + time.Sleep(30 * time.Second) if bm.IsExist("astaxie") { t.Error("check err") diff --git a/cache/memcache.go b/cache/memcache.go index ae261989..331f1e0c 100644 --- a/cache/memcache.go +++ b/cache/memcache.go @@ -28,7 +28,7 @@ func (rc *MemcacheCache) Get(key string) interface{} { return contain } -func (rc *MemcacheCache) Put(key string, val interface{}, timeout int) error { +func (rc *MemcacheCache) Put(key string, val interface{}, timeout int64) error { if rc.c == nil { rc.c = rc.connectInit() } diff --git a/cache/memory.go b/cache/memory.go index 7097759d..fd1536cb 100644 --- a/cache/memory.go +++ b/cache/memory.go @@ -4,7 +4,6 @@ import ( "encoding/json" "errors" "fmt" - "strconv" "sync" "time" ) @@ -16,12 +15,7 @@ var ( type MemoryItem struct { val interface{} Lastaccess time.Time - expired int -} - -func (itm *MemoryItem) Access() interface{} { - itm.Lastaccess = time.Now() - return itm.val + expired int64 } type MemoryCache struct { @@ -44,13 +38,21 @@ func (bc *MemoryCache) Get(name string) interface{} { if !ok { return nil } - return itm.Access() + if (time.Now().Unix() - itm.Lastaccess.Unix()) > itm.expired { + go bc.Delete(name) + return nil + } + return itm.val } -func (bc *MemoryCache) Put(name string, value interface{}, expired int) error { +func (bc *MemoryCache) Put(name string, value interface{}, expired int64) error { bc.lock.Lock() defer bc.lock.Unlock() - t := MemoryItem{val: value, Lastaccess: time.Now(), expired: expired} + t := MemoryItem{ + val: value, + Lastaccess: time.Now(), + expired: expired, + } if _, ok := bc.items[name]; ok { return errors.New("the key is exist") } else { @@ -87,11 +89,11 @@ func (bc *MemoryCache) ClearAll() error { return nil } -// Start activates the file cache; it will +// Start activates the file cache; it will func (bc *MemoryCache) StartAndGC(config string) error { var cf map[string]int json.Unmarshal([]byte(config), &cf) - if _, ok := cf["every"]; !ok { + if _, ok := cf["interval"]; !ok { cf = make(map[string]int) cf["interval"] = DefaultEvery } @@ -110,7 +112,7 @@ func (bc *MemoryCache) vaccuum() { return } for { - <-time.After(time.Duration(bc.dur) * time.Second) + <-time.After(bc.dur) if bc.items == nil { return } @@ -128,12 +130,8 @@ func (bc *MemoryCache) item_expired(name string) bool { if !ok { return true } - dur := time.Now().Sub(itm.Lastaccess) - sec, err := strconv.Atoi(fmt.Sprintf("%0.0f", dur.Seconds())) - if err != nil { - delete(bc.items, name) - return true - } else if sec >= itm.expired { + sec := time.Now().Unix() - itm.Lastaccess.Unix() + if sec >= itm.expired { delete(bc.items, name) return true } diff --git a/cache/redis.go b/cache/redis.go index 6c39ce20..2b01c82a 100644 --- a/cache/redis.go +++ b/cache/redis.go @@ -31,7 +31,7 @@ func (rc *RedisCache) Get(key string) interface{} { return v } -func (rc *RedisCache) Put(key string, val interface{}, timeout int) error { +func (rc *RedisCache) Put(key string, val interface{}, timeout int64) error { if rc.c == nil { rc.c = rc.connectInit() }