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)

posted on 2013-08-20 14:28  黑暗伯爵  阅读(1671)  评论(0编辑  收藏  举报

导航