在我基於 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 }
歡迎各位朋友留言評論一塊兒學習交流。