Go Revel - Cache(緩存)
revel在服務(wù)器端提供了`cache`庫(kù)用以低延遲的存儲(chǔ)臨時(shí)數(shù)據(jù)。它緩存那些需要經(jīng)常訪問(wèn)數(shù)據(jù)庫(kù)但是變化不頻繁的數(shù)據(jù),也可以實(shí)現(xiàn)用戶會(huì)話的存儲(chǔ)。
##有效期
一下三種方法為緩存元素設(shè)置過(guò)期時(shí)間:
1、 一個(gè)`time.Duration`值
2、`cache.DEFAULT`值, 應(yīng)用程序范圍的過(guò)期時(shí)間(默認(rèn)為1小時(shí))
3、`cache.FOREVER`值, 永不過(guò)期
注意,調(diào)用者不能過(guò)度以來(lái)緩存中的數(shù)據(jù),因?yàn)檫@些數(shù)據(jù)不具備持久保持的能力,并且重啟緩存時(shí),這些數(shù)據(jù)都將被清空。
##序列化
緩存器的`getters`與`setters`會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)為調(diào)用者期望的類型:
1、如果數(shù)據(jù)是`[]byte`類類型,則不會(huì)再進(jìn)行序列化
2、如果數(shù)據(jù)是任意整數(shù)類型,則以ASCII存儲(chǔ)
3、否則,都以`encoding/gob`編碼存儲(chǔ)
##實(shí)現(xiàn)方式
緩存可以配置為下列實(shí)現(xiàn)之一:
1、一個(gè)`memcached`主機(jī)列表
2、一個(gè)基于內(nèi)存的實(shí)現(xiàn)
##配置
在`app.conf`中以下列方式配置:
1、`cache.expires` - 能被`time.ParseDuration`處理的過(guò)期時(shí)間(默認(rèn)為1小時(shí))
2、`cache.memcached` - 布爾值,是否啟用`memcached`(默認(rèn)不啟用)
3、`cache.hosts` - 以`,`逗號(hào)分割的主機(jī)列表,只有當(dāng)`memcached`啟用時(shí)才有效。
##使用示例
下面示例包含了常用的操作,要注意的是,如果不需要取得返回結(jié)果來(lái)對(duì)請(qǐng)求做進(jìn)一步處理的話,那么最好在一個(gè)`goroutine`中去處理緩存。
import (
"github.com/robfig/revel"
"github.com/robfig/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")
}
##存儲(chǔ)會(huì)話
`Cache`緩存器具有全局的key空間 - 使用它存儲(chǔ)會(huì)話,調(diào)用著應(yīng)當(dāng)使用會(huì)話的UUID來(lái)作為key。
cache.Set(c.Session.Id(), products)
// 在后續(xù)的請(qǐng)求中
err := cache.Get(c.Session.Id(), &products)
posted on 2013-08-20 14:28 黑暗伯爵 閱讀(1680) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)