gfast 的数据缓存是使用了gf框架的 gcache 模块,进行了轻量的service封装,主要是添加了缓存标签支持,可以对同类型的数据定义一个标签,清除缓存时可以按照标签分类清除。

使用方式

例如用户权限的缓存,当缓存了用户权限的时候,我们在后台又修改过角色信息(角色重新授权),修改了用户信息(用户重新设置了所属角色)后就需要清空旧的缓存生成新的缓存,就可以使用缓存标签将角色和用户的增删改设置同一个标签,在清除缓存的时候只清理权限相关的标签,不影响其他模块缓存数据。

示例代码:

import "gfast/app/common/service"
//获取所有菜单并缓存
func (s *rule) GetMenuList() (list []*model.SysAuthRuleInfoRes, err error) {
    cache := service.Cache.New()
    //从缓存获取
    iList := cache.Get(global.SysAuthMenu)
    if iList != nil {
        err = gconv.Struct(iList, &list)
        return
    }
    //从数据库获取
    list, err = dao.SysAuthRule.GetMenuList()
    if err != nil || list == nil {
        return
    }
    //缓存菜单
    cache.Set(global.SysAuthMenu, list, 0, global.SysAuthTag)
    return
}
// GetRoleList 获取角色列表
func (s *sysRole) GetRoleList() (list []*model.SysRole, err error) {
    cache := service.Cache.New()
    //从缓存获取
    iList := cache.Get(global.SysRole)
    if iList != nil {
        err = gconv.Struct(iList, &list)
        return
    }
    //从数据库获取
    list, err = dao.SysRole.Order(dao.SysRole.Columns.ListOrder + " asc," + dao.SysRole.Columns.Id + " asc").All()
    if err != nil {
        g.Log().Error(err)
        err = gerror.New("获取角色数据失败")
    }
    //缓存数据
    cache.Set(global.SysRole, list, 0, global.SysAuthTag)
    iList = cache.Get(global.SysRole)
    return
}

* 可以看到上面我们都使用同一个缓存标签global.SysAuthTag 这样当我们修改了用户信息,或者角色,或者菜单信息后,就不用依次去根据缓存键去删除缓存的菜单、角色等信息,只要通过这个标签就能一次性更新这几个缓存数据。*

//当修改了角色后通过缓存标签删除和权限相关的缓存数据
func (s *sysRole) EditRolePost(m map[string]interface{}, id int) error {
    tx, err := g.DB("default").Begin() //开启事务
    if err != nil {
        return err
    }
    err = s.EditRole(tx, m)
    if err != nil {
        tx.Rollback()
        return err
    }
    err = s.EditRoleRule(m["menuIds"], int64(id))
    if err != nil {
        tx.Rollback() //回滚
        return err
    }
    tx.Commit()
    //清除TAG缓存
    service.Cache.New().RemoveByTag(global.SysAuthTag)
    return nil
}

同时对应的缓存标签为了好维护,可以设置对应的常量来区分:

package global

const (
    //缓存前缀
    cachePrefix = "cache_"  //缓存前缀可以用来区分在同一台服务器环境部署多个系统缓存数据(防止缓存混淆)

    // SysAuthMenu 缓存菜单KEY
    SysAuthMenu = cachePrefix + "sysAuthMenu"
    // SysDict 字典缓存菜单KEY
    SysDict = cachePrefix + "sysDict"
    // SysRole 角色缓存key
    SysRole = cachePrefix + "sysRole"
    // SysWebSet 站点配置缓存key
    SysWebSet = cachePrefix + "sysWebSet"

    // SysAuthTag 权限缓存TAG标签
    SysAuthTag = cachePrefix + "sysAuthTag"
    // SysDictTag 字典缓存标签
    SysDictTag = cachePrefix + "sysDictTag"
    // SysConfigTag 系统参数配置
    SysConfigTag = cachePrefix + "sysConfigTag"
)

数据缓存配置

# Redis数据库配置
[redis]
    open = true #是否开启 redis 缓存 若不开启使用gchache缓存方式
    default = "127.0.0.1:6379,9?idleTimeout=600"
文档更新时间: 2021-07-20 15:59   作者:admin