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 }