Beego 中容易被咱們忽視的問題之 Memory 緩存篇

前言

在我基於 beego 寫博客的時候遇到一個很奇怪的問題,那就是在使用 Memory Cache 類型緩存的時候,緩存不生效非常奇怪,可是使用 redis 就沒問題。因爲時間問題我就沒有深究,畢竟那時候實際上也會選用Memory作緩存的。因此就放了下來,直到今天在羣裏有人問了一樣的問題。我決定去研究一下這個坑。html

咱們先來看一個例子

Set Cache 代碼:redis

var (
    urlcache cache.Cache
)

func init() {
    urlcache, _ = cache.NewCache("memory", `{"interval":10}`)
}


func (this *SetController) Get() {
        urlcache.Put("test", "test result sada", 60)
}

Get Cache 代碼:json

func (this *GetController) Get() {

    result := urlcache.Get("test")

    this.Data["json"] = result
    this.ServeJSON()
}

先賣個關子,先別往下看,思考一下大家以爲輸出的結果是什麼?緩存

沒錯,結果是:學習

null

那麼咱們再看一下例子:

Set Cache 代碼:this

var (
    urlcache cache.Cache
)

func init() {
    urlcache, _ = cache.NewCache("memory", `{"interval":10}`)
}


func (this *SetController) Get() {
        urlcache.Put("test", "test result sada", 0)
}

Get Cache 代碼:url

func (this *GetController) Get() {

    result := urlcache.Get("test")

    this.Data["json"] = result
    this.ServeJSON()
}

再來猜一下這回結果是什麼?spa

你們可能都知道了,結果:rest

test result sada

那糾到底是爲何會這樣呢?真相只有一個!

原來這個 Put 的第三個參數,設置內存的 GC 的時間單位是 time.Duration 也就是咱們說的納秒,因此咱們在直接設置這個時間的時候常常忽略單位只寫了個數字,因此最後咱們回頭取緩存的時候,緩存早已通過期的了。
這個事情告訴咱們看文檔必定要細心。我貼一下文檔以及 Cache 源碼:code

官方文檔給的接口:

type Cache interface {
    Get(key string) interface{}
    GetMulti(keys []string) []interface{}
    Put(key string, val interface{}, timeout time.Duration) error
    Delete(key string) error
    Incr(key string) error
    Decr(key string) error
    IsExist(key string) bool
    ClearAll() error
    StartAndGC(config string) error
}

memory.go源碼:

// Put cache to memory.
// if lifespan is 0, it will be forever till restart.
func (bc *MemoryCache) Put(name string, value interface{}, lifespan time.Duration) error {
    bc.Lock()
    defer bc.Unlock()
    bc.items[name] = &MemoryItem{
        val:         value,
        createdTime: time.Now(),
        lifespan:    lifespan,
    }
    return nil
}

歡迎各位朋友留言評論一塊兒學習交流。

點我閱讀原文

相關文章
相關標籤/搜索