Revel 提供了一個(gè)服務(wù)器端、臨時(shí)的、低延遲存儲(chǔ)的緩存庫(kù)。對(duì)于頻繁訪問(wèn)數(shù)據(jù)庫(kù)中緩慢變化的數(shù)據(jù),使用緩存一個(gè)很好的方法,并且它也可以用于實(shí)現(xiàn)用戶session (如果基于cookie的session不足).
參考 緩存接口
緩存有三種過(guò)期時(shí)間:
time.Duration
?,指定一個(gè)過(guò)期時(shí)間。cache.DEFAULT
, 默認(rèn)過(guò)期時(shí)間(1小時(shí))。cache.FOREVER
, 永不過(guò)期。重要提示:調(diào)用者不能依賴于存在于緩存中內(nèi)容,因?yàn)閿?shù)據(jù)是不持久保存,重新啟動(dòng)后,會(huì)清除所有緩存數(shù)據(jù)。
緩存讀寫接口自動(dòng)為調(diào)用者序列化任何類型的的值。有以下幾種方式:
[]byte
類型, 數(shù)據(jù)保持不變。encoding/gob
進(jìn)行編碼。緩存通過(guò)以下幾種方式進(jìn)行配置:
在app.conf
中配置緩存:
cache.expires
- 一個(gè)字符串,time.ParseDuration
類型,指定一個(gè)過(guò)期時(shí)間 (默認(rèn)1小時(shí))cache.memcached
-一個(gè)布爾值,是否開啟memcached緩存 (默認(rèn)不開啟)cache.redis
-一個(gè)布爾值,是否開啟redis緩存 (默認(rèn)不開啟)cache.hosts
- 緩存的主機(jī)列表(多個(gè)主機(jī)使用逗號(hào)分隔),cache.memcached
開啟后有效。下面是常見(jiàn)操作的一個(gè)例子。請(qǐng)注意,如果不需要調(diào)用的結(jié)果來(lái)處理請(qǐng)求,調(diào)用者可以在新的goroutine調(diào)用緩存操作。
import (
"github.com/revel/revel"
"github.com/revel/revel/cache"
)
func (c App) ShowProduct(id string) revel.Result {
var product Product
if err := cache.Get("product_"+id, &product); err != nil {
product = loadProduct(id)
go cache.Set("product_"+id, product, 30*time.Minute)
}
return c.Render(product)
}
func (c App) AddProduct(name string, price int) revel.Result {
product := NewProduct(name, price)
product.Save()
return c.Redirect("/products/%d", product.id)
}
func (c App) EditProduct(id, name string, price int) revel.Result {
product := loadProduct(id)
product.name = name
product.price = price
go cache.Set("product_"+id, product, 30*time.Minute)
return c.Redirect("/products/%d", id)
}
func (c App) DeleteProduct(id string) revel.Result {
product := loadProduct(id)
product.Delete()
go cache.Delete("product_"+id)
return c.Redirect("/products")
}
緩存有一個(gè)全球性的key空間 - 使用它作為一個(gè)session存儲(chǔ),調(diào)用方應(yīng)采用session UUID的優(yōu)點(diǎn),如下圖所示:
cache.Set(c.Session.Id(), products)
// 然后在隨后的請(qǐng)求中使用它
err := cache.Get(c.Session.Id(), &products)
更多建議: