revel在服務器端提供了`cache`庫用以低延遲的存儲臨時數據。它緩存那些須要常常訪問數據庫可是變化不頻繁的數據,也能夠實現用戶會話的存儲。 ##有效期 一下三種方法爲緩存元素設置過時時間: 一、 一個`time.Duration`值 二、`cache.DEFAULT`值, 應用程序範圍的過時時間(默認爲1小時) 三、`cache.FOREVER`值, 永不過時 注意,調用者不能過分以來緩存中的數據,由於這些數據不具有持久保持的能力,而且重啓緩存時,這些數據都將被清空。 ##序列化 緩存器的`getters`與`setters`會自動轉換數據爲調用者指望的類型: 一、若是數據是`[]byte`類類型,則不會再進行序列化 二、若是數據是任意整數類型,則以ASCII存儲 三、不然,都以`encoding/gob`編碼存儲 ##實現方式 緩存能夠配置爲下列實現之一: 一、一個`memcached`主機列表 二、一個基於內存的實現 ##配置 在`app.conf`中如下列方式配置: 一、`cache.expires` - 能被`time.ParseDuration`處理的過時時間(默認爲1小時) 二、`cache.memcached` - 布爾值,是否啓用`memcached`(默認不啓用) 三、`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)