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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述