123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- 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, ","))
- }
|