首页 / MYSQL / [转]beegocache
[转]beegocache
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了[转]beegocache,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2489字,纯文字阅读大概需要4分钟。
内容图文
![[转]beegocache](/upload/InfoBanner/zyjiaocheng/536/26d4802d81604e77a9980743663e8a48.jpg)
package beegoimport (errorsfmtstrconvsynctime)var (DefaultEvery int = 60 // 1 minute)type BeeItem struct {val interface{}Lastaccess time.Timeexpired int}func (itm *BeeItem) Access() interface{} {itm.Lastaccess = time.Now()return itm.val}ty
package beego import ( "errors" "fmt" "strconv" "sync" "time" ) var ( DefaultEvery int = 60 // 1 minute ) type BeeItem struct { val interface{} Lastaccess time.Time expired int } func (itm *BeeItem) Access() interface{} { itm.Lastaccess = time.Now() return itm.val } type BeeCache struct { lock sync.RWMutex dur time.Duration items map[string]*BeeItem Every int // Run an expiration check Every seconds } // NewDefaultCache returns a new FileCache with sane defaults. func NewBeeCache() *BeeCache { cache := BeeCache{dur: time.Since(time.Now()), Every: DefaultEvery} return &cache } func (bc *BeeCache) Get(name string) interface{} { bc.lock.RLock() defer bc.lock.RUnlock() itm, ok := bc.items[name] if !ok { return nil } return itm.Access() } func (bc *BeeCache) Put(name string, value interface{}, expired int) error { bc.lock.Lock() defer bc.lock.Unlock() t := BeeItem{val: value, Lastaccess: time.Now(), expired: expired} if _, ok := bc.items[name]; ok { return errors.New("the key is exist") } else { bc.items[name] = &t } return nil } func (bc *BeeCache) Delete(name string) (ok bool, err error) { bc.lock.Lock() defer bc.lock.Unlock() if _, ok = bc.items[name]; !ok { return } delete(bc.items, name) _, valid := bc.items[name] if valid { ok = false } return } func (bc *BeeCache) IsExist(name string) bool { bc.lock.RLock() defer bc.lock.RUnlock() _, ok := bc.items[name] return ok } // Start activates the file cache; it will func (bc *BeeCache) Start() error { dur, err := time.ParseDuration(fmt.Sprintf("%ds", bc.Every)) if err != nil { return err } bc.dur = dur bc.items = make(map[string]*BeeItem, 0) go bc.vaccuum() return nil } func (bc *BeeCache) vaccuum() { if bc.Every < 1 { return } for { <-time.After(time.Duration(bc.dur)) if bc.items == nil { return } for name, _ := range bc.items { bc.item_expired(name) } } } // item_expired returns true if an item is expired. func (bc *BeeCache) item_expired(name string) bool { bc.lock.Lock() defer bc.lock.Unlock() itm, ok := bc.items[name] 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 { delete(bc.items, name) return true } return false }
内容总结
以上是互联网集市为您收集整理的[转]beegocache全部内容,希望文章能够帮你解决[转]beegocache所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。