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"
)
# Redis數(shù)據(jù)庫配置
[redis]
open = true #是否開啟 redis 緩存 若不開啟使用gchache緩存方式
default = "127.0.0.1:6379,9?idleTimeout=600"
更多建議: