gfast 的數(shù)據(jù)緩存是使用了gf框架的 gcache 模塊,進(jìn)行了輕量的service封裝,主要是添加了緩存標(biāo)簽支持,可以對(duì)同類型的數(shù)據(jù)定義一個(gè)標(biāo)簽,清除緩存時(shí)可以按照標(biāo)簽分類清除。
例如用戶權(quán)限的緩存,當(dāng)緩存了用戶權(quán)限的時(shí)候,我們?cè)诤笈_(tái)又修改過角色信息(角色重新授權(quán)),修改了用戶信息(用戶重新設(shè)置了所屬角色)后就需要清空舊的緩存生成新的緩存,就可以使用緩存標(biāo)簽將角色和用戶的增刪改設(shè)置同一個(gè)標(biāo)簽,在清除緩存的時(shí)候只清理權(quán)限相關(guān)的標(biāo)簽,不影響其他模塊緩存數(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ù)庫(kù)獲取
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ù)庫(kù)獲取
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
}
可以看到上面我們都使用同一個(gè)緩存標(biāo)簽?global.SysAuthTag
? 這樣當(dāng)我們修改了用戶信息,或者角色,或者菜單信息后,就不用依次去根據(jù)緩存鍵去刪除緩存的菜單、角色等信息,只要通過這個(gè)標(biāo)簽就能一次性更新這幾個(gè)緩存數(shù)據(jù)。
//當(dāng)修改了角色后通過緩存標(biāo)簽刪除和權(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
}
同時(shí)對(duì)應(yīng)的緩存標(biāo)簽為了好維護(hù),可以設(shè)置對(duì)應(yīng)的常量來區(qū)分:
package global
const (
//緩存前綴
cachePrefix = "cache_" //緩存前綴可以用來區(qū)分在同一臺(tái)服務(wù)器環(huán)境部署多個(gè)系統(tǒng)緩存數(shù)據(jù)(防止緩存混淆)
// SysAuthMenu 緩存菜單KEY
SysAuthMenu = cachePrefix + "sysAuthMenu"
// SysDict 字典緩存菜單KEY
SysDict = cachePrefix + "sysDict"
// SysRole 角色緩存key
SysRole = cachePrefix + "sysRole"
// SysWebSet 站點(diǎn)配置緩存key
SysWebSet = cachePrefix + "sysWebSet"
// SysAuthTag 權(quán)限緩存TAG標(biāo)簽
SysAuthTag = cachePrefix + "sysAuthTag"
// SysDictTag 字典緩存標(biāo)簽
SysDictTag = cachePrefix + "sysDictTag"
// SysConfigTag 系統(tǒng)參數(shù)配置
SysConfigTag = cachePrefix + "sysConfigTag"
)
# Redis數(shù)據(jù)庫(kù)配置
[redis]
open = true #是否開啟 redis 緩存 若不開啟使用gchache緩存方式
default = "127.0.0.1:6379,9?idleTimeout=600"
更多建議: