×

概要

Revel 介绍Revel 概念Revel 项目结构

Revel 控制器

Revel 控制器概要Revel 路由routesRevel 参数绑定Revel 参数验证Revel Session / FlashRevel 国际化Revel Results

Revel 模板

Revel 拦截器Revel 缓存CacheRevel 过滤器Revel Websockets

Revel 模块

Revel 模块概要Revel 测试Revel 计划任务

Revel 操作

Revel 日志类型Revel 版本控制Revel 部署

Revel 参考资料

Revel 配置文件app.confRevel 命令行工具Revel 常见问题

Revel 缓存Cache


Revel 提供了一个服务器端、临时的、低延迟存储的缓存库。对于频繁访问数据库中缓慢变化的数据,使用缓存一个很好的方法,并且它也可以用于实现用户session (如果基于cookie的session不足).

参考 缓存接口

过期时间

缓存有三种过期时间:

  • time.Duration,指定一个过期时间。
  • cache.DEFAULT, 默认过期时间(1小时)。
  • cache.FOREVER, 永不过期。

重要提示:调用者不能依赖于存在于缓存中内容,因为数据是不持久保存,重新启动后,会清除所有缓存数据。

序列化

缓存读写接口自动为调用者序列化任何类型的的值。有以下几种方式:

  • 如果是 []byte类型, 数据保持不变。
  • 如果是 整数类型, 数据被保存为 ASCII。
  • 其他类型,使用 encoding/gob进行编码。

实现

缓存通过以下几种方式进行配置:

  • 分布式memcached 主机缓存
  • 单独 redis 主机缓存
  • 本地内存缓存

配置

app.conf中配置缓存:

  • cache.expires - 一个字符串,time.ParseDuration 类型,指定一个过期时间 (默认1小时)
  • cache.memcached -一个布尔值,是否开启memcached缓存 (默认不开启)
  • cache.redis -一个布尔值,是否开启redis缓存 (默认不开启)
  • cache.hosts - 缓存的主机列表(多个主机使用逗号分隔),cache.memcached开启后有效。

例如

下面是常见操作的一个例子。请注意,如果不需要调用的结果来处理请求,调用者可以在新的goroutine调用缓存操作。

import (
    "github.com/revel/revel"
    "github.com/revel/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")
}

Session 用法

缓存有一个全球性的key空间 - 使用它作为一个session存储,调用方应采用session UUID的优点,如下图所示:

cache.Set(c.Session.Id(), products)

// 然后在随后的请求中使用它
err := cache.Get(c.Session.Id(), &products)

分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)