Go Revel - Cache(缓存)
revel在服务器端提供了`cache`库用以低延迟的存储临时数据。它缓存那些需要经常访问数据库但是变化不频繁的数据,也可以实现用户会话的存储。
##有效期
一下三种方法为缓存元素设置过期时间:
1、 一个`time.Duration`值
2、`cache.DEFAULT`值, 应用程序范围的过期时间(默认为1小时)
3、`cache.FOREVER`值, 永不过期
注意,调用者不能过度以来缓存中的数据,因为这些数据不具备持久保持的能力,并且重启缓存时,这些数据都将被清空。
##序列化
缓存器的`getters`与`setters`会自动转换数据为调用者期望的类型:
1、如果数据是`[]byte`类类型,则不会再进行序列化
2、如果数据是任意整数类型,则以ASCII存储
3、否则,都以`encoding/gob`编码存储
##实现方式
缓存可以配置为下列实现之一:
1、一个`memcached`主机列表
2、一个基于内存的实现
##配置
在`app.conf`中以下列方式配置:
1、`cache.expires` - 能被`time.ParseDuration`处理的过期时间(默认为1小时)
2、`cache.memcached` - 布尔值,是否启用`memcached`(默认不启用)
3、`cache.hosts` - 以`,`逗号分割的主机列表,只有当`memcached`启用时才有效。
##使用示例
下面示例包含了常用的操作,要注意的是,如果不需要取得返回结果来对请求做进一步处理的话,那么最好在一个`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")
}
##存储会话
`Cache`缓存器具有全局的key空间 - 使用它存储会话,调用着应当使用会话的UUID来作为key。
cache.Set(c.Session.Id(), products)
// 在后续的请求中
err := cache.Get(c.Session.Id(), &products)