gitee.com/h79/goutils@v1.22.10/loader/cache.go (about)

     1  package loader
     2  
     3  import (
     4  	"context"
     5  	"gitee.com/h79/goutils/dao"
     6  )
     7  
     8  type Cache struct {
     9  	Loader
    10  	cacheLoader CacheLoadFunc
    11  	dao         *dao.Dao
    12  	key         string
    13  	da          interface{}
    14  }
    15  
    16  type CacheLoadFunc func(dao *dao.Dao, opt *CacheOption) error
    17  
    18  type CacheOption struct {
    19  	Key  string
    20  	Data interface{}
    21  }
    22  
    23  func NewCache(key string, dao *dao.Dao, data interface{}) *Loader {
    24  	cache := &Cache{
    25  		Loader: CreateLoader(),
    26  		dao:    dao,
    27  		key:    key,
    28  		da:     data,
    29  	}
    30  	return cache.WithLoadFunc(cache.load)
    31  }
    32  
    33  func (ca *Cache) WithCacheLoadFunc(fn CacheLoadFunc) *Cache {
    34  	ca.cacheLoader = fn
    35  	return ca
    36  }
    37  
    38  func (ca *Cache) load() (interface{}, error) {
    39  	if ca.cacheLoader != nil {
    40  		opt := CacheOption{
    41  			Key:  ca.key,
    42  			Data: ca.da,
    43  		}
    44  		err := ca.cacheLoader(ca.dao, &opt)
    45  		if err != nil {
    46  			return nil, err
    47  		}
    48  		return opt.Data, nil
    49  	}
    50  	return ca.defaultLoad()
    51  }
    52  
    53  func (ca *Cache) defaultLoad() (interface{}, error) {
    54  	client, err := ca.dao.RedisClient()
    55  	if err != nil {
    56  		return ca.da, err
    57  	}
    58  	ret, err := client.Get(context.Background(), ca.key).Result()
    59  	if err != nil {
    60  		return ca.da, err
    61  	}
    62  	if err = ca.unmarshal.Unmarshal([]byte(ret), ca.da); err != nil {
    63  		return ca.da, err
    64  	}
    65  	return ca.da, nil
    66  }