gfast 后端開發(fā)-數(shù)據(jù)緩存

2022-03-29 16:34 更新

gfast 的數(shù)據(jù)緩存是使用了gf框架的 gcache 模塊,進行了輕量的service封裝,主要是添加了緩存標簽支持,可以對同類型的數(shù)據(jù)定義一個標簽,清除緩存時可以按照標簽分類清除。

使用方式

例如用戶權(quán)限的緩存,當緩存了用戶權(quán)限的時候,我們在后臺又修改過角色信息(角色重新授權(quán)),修改了用戶信息(用戶重新設(shè)置了所屬角色)后就需要清空舊的緩存生成新的緩存,就可以使用緩存標簽將角色和用戶的增刪改設(shè)置同一個標簽,在清除緩存的時候只清理權(quán)限相關(guān)的標簽,不影響其他模塊緩存數(shù)據(jù)。

示例代碼:

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
    }
    //從數(shù)據(jù)庫獲取
    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
    }
    //從數(shù)據(jù)庫獲取
    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("獲取角色數(shù)據(jù)失敗")
    }
    //緩存數(shù)據(jù)
    cache.Set(global.SysRole, list, 0, global.SysAuthTag)
    iList = cache.Get(global.SysRole)
    return
}

可以看到上面我們都使用同一個緩存標簽?global.SysAuthTag? 這樣當我們修改了用戶信息,或者角色,或者菜單信息后,就不用依次去根據(jù)緩存鍵去刪除緩存的菜單、角色等信息,只要通過這個標簽就能一次性更新這幾個緩存數(shù)據(jù)。

//當修改了角色后通過緩存標簽刪除和權(quán)限相關(guān)的緩存數(shù)據(jù)
func (s *sysRole) EditRolePost(m map[string]interface{}, id int) error {
    tx, err := g.DB("default").Begin() //開啟事務(wù)
    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
}

同時對應(yīng)的緩存標簽為了好維護,可以設(shè)置對應(yīng)的常量來區(qū)分:

package global

const (
    //緩存前綴
    cachePrefix = "cache_"  //緩存前綴可以用來區(qū)分在同一臺服務(wù)器環(huán)境部署多個系統(tǒng)緩存數(shù)據(jù)(防止緩存混淆)

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

    // SysAuthTag 權(quán)限緩存TAG標簽
    SysAuthTag = cachePrefix + "sysAuthTag"
    // SysDictTag 字典緩存標簽
    SysDictTag = cachePrefix + "sysDictTag"
    // SysConfigTag 系統(tǒng)參數(shù)配置
    SysConfigTag = cachePrefix + "sysConfigTag"
)

m_86afdcf6c563be6d43d8c873845717ae_r

數(shù)據(jù)緩存配置

# Redis數(shù)據(jù)庫配置
[redis]
    open = true #是否開啟 redis 緩存 若不開啟使用gchache緩存方式
    default = "127.0.0.1:6379,9?idleTimeout=600"


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號