1
0
mirror of https://github.com/astaxie/beego.git synced 2024-11-22 07:30:55 +00:00

fix cache's bug expird is not changed by get method

This commit is contained in:
astaxie 2013-07-04 13:02:11 +08:00
parent 9b392a0601
commit 174298b497
5 changed files with 23 additions and 25 deletions

4
cache/cache.go vendored
View File

@ -6,7 +6,7 @@ import (
type Cache interface { type Cache interface {
Get(key string) 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 Delete(key string) error
IsExist(key string) bool IsExist(key string) bool
ClearAll() error ClearAll() error
@ -28,7 +28,7 @@ func Register(name string, adapter Cache) {
adapters[name] = adapter 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) { func NewCache(adapterName, config string) (Cache, error) {
adapter, ok := adapters[adapterName] adapter, ok := adapters[adapterName]
if !ok { if !ok {

4
cache/cache_test.go vendored
View File

@ -6,7 +6,7 @@ import (
) )
func Test_cache(t *testing.T) { func Test_cache(t *testing.T) {
bm, err := NewCache("memory", `{"interval":60}`) bm, err := NewCache("memory", `{"interval":20}`)
if err != nil { if err != nil {
t.Error("init err") t.Error("init err")
} }
@ -21,7 +21,7 @@ func Test_cache(t *testing.T) {
t.Error("get err") t.Error("get err")
} }
time.Sleep(70 * time.Second) time.Sleep(30 * time.Second)
if bm.IsExist("astaxie") { if bm.IsExist("astaxie") {
t.Error("check err") t.Error("check err")

2
cache/memcache.go vendored
View File

@ -28,7 +28,7 @@ func (rc *MemcacheCache) Get(key string) interface{} {
return contain 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 { if rc.c == nil {
rc.c = rc.connectInit() rc.c = rc.connectInit()
} }

36
cache/memory.go vendored
View File

@ -4,7 +4,6 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"strconv"
"sync" "sync"
"time" "time"
) )
@ -16,12 +15,7 @@ var (
type MemoryItem struct { type MemoryItem struct {
val interface{} val interface{}
Lastaccess time.Time Lastaccess time.Time
expired int expired int64
}
func (itm *MemoryItem) Access() interface{} {
itm.Lastaccess = time.Now()
return itm.val
} }
type MemoryCache struct { type MemoryCache struct {
@ -44,13 +38,21 @@ func (bc *MemoryCache) Get(name string) interface{} {
if !ok { if !ok {
return nil 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() bc.lock.Lock()
defer bc.lock.Unlock() 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 { if _, ok := bc.items[name]; ok {
return errors.New("the key is exist") return errors.New("the key is exist")
} else { } else {
@ -87,11 +89,11 @@ func (bc *MemoryCache) ClearAll() error {
return nil return nil
} }
// Start activates the file cache; it will // Start activates the file cache; it will
func (bc *MemoryCache) StartAndGC(config string) error { func (bc *MemoryCache) StartAndGC(config string) error {
var cf map[string]int var cf map[string]int
json.Unmarshal([]byte(config), &cf) json.Unmarshal([]byte(config), &cf)
if _, ok := cf["every"]; !ok { if _, ok := cf["interval"]; !ok {
cf = make(map[string]int) cf = make(map[string]int)
cf["interval"] = DefaultEvery cf["interval"] = DefaultEvery
} }
@ -110,7 +112,7 @@ func (bc *MemoryCache) vaccuum() {
return return
} }
for { for {
<-time.After(time.Duration(bc.dur) * time.Second) <-time.After(bc.dur)
if bc.items == nil { if bc.items == nil {
return return
} }
@ -128,12 +130,8 @@ func (bc *MemoryCache) item_expired(name string) bool {
if !ok { if !ok {
return true return true
} }
dur := time.Now().Sub(itm.Lastaccess) sec := time.Now().Unix() - itm.Lastaccess.Unix()
sec, err := strconv.Atoi(fmt.Sprintf("%0.0f", dur.Seconds())) if sec >= itm.expired {
if err != nil {
delete(bc.items, name)
return true
} else if sec >= itm.expired {
delete(bc.items, name) delete(bc.items, name)
return true return true
} }

2
cache/redis.go vendored
View File

@ -31,7 +31,7 @@ func (rc *RedisCache) Get(key string) interface{} {
return v 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 { if rc.c == nil {
rc.c = rc.connectInit() rc.c = rc.connectInit()
} }