package model import ( "app.yhyue.com/moapp/jybase/redis" "fmt" "github.com/gogf/gf/v2/container/gvar" "github.com/gogf/gf/v2/errors/gerror" "strings" "sync" "time" ) // GetL2CacheData 二级缓存 // 注意 lock定义为全局锁 func GetL2CacheData(dbName string, lock *sync.RWMutex, key string, f func() interface{}, cacheSec int) *gvar.Var { var ( data = gvar.New(redis.Get(dbName, key)) newData *gvar.Var ) if data.IsEmpty() { data = gvar.New(redis.Get(dbName, fmt.Sprintf("%s_L2Cache", key))) go func() { if lock.TryLock() { defer lock.Unlock() if n := f(); n != nil { newData = gvar.New(n) go func() { redis.Put(dbName, key, newData, cacheSec) redis.Put(dbName, fmt.Sprintf("%s_L2Cache", key), newData, -1) }() } } }() if data.IsEmpty() { time.Sleep(100 * time.Millisecond) if newData.IsEmpty() { data = newData } } } return data } // ClearL2Cache 清除缓存 func ClearL2Cache(dbName, key string) (err error) { var errCacheKey []string for i := 1; i <= 2; i++ { fKey := key if i != 1 { fKey = fmt.Sprintf("%s_L2Cache", key) } if ok := redis.Del(dbName, fKey); !ok { errCacheKey = append(errCacheKey, fKey) } } if len(errCacheKey) == 0 { return nil } return gerror.Newf("清除缓存失败%s", strings.Join(errCacheKey, ",")) }