bilibili-backup/app/interface/main/mcn/dao/datadao/cache.go

144 lines
3.5 KiB
Go
Raw Permalink Normal View History

2019-04-22 10:59:20 +08:00
package datadao
import (
"context"
"encoding/json"
"fmt"
"go-common/app/interface/main/mcn/conf"
"go-common/app/interface/main/mcn/model/mcnmodel"
"go-common/app/interface/main/mcn/tool/cache"
"time"
)
var (
dateFmt = "20060102"
)
//CacheBaseLoader base loader
type CacheBaseLoader struct {
SignID int64
Date time.Time
Val interface{}
desc string
}
func descHelper(d cache.DataLoader) (key string) {
return d.Desc()
}
func newCacheBaseLoader(signID int64, date time.Time, val interface{}, desc string) CacheBaseLoader {
return CacheBaseLoader{SignID: signID, Date: date, Val: val, desc: desc}
}
//Key cache's key
func (s *CacheBaseLoader) Key() (key string) {
return fmt.Sprintf("%s_%d_%s", descHelper(s), s.SignID, s.Date.Format(dateFmt))
}
//Value cache's value
func (s *CacheBaseLoader) Value() (value interface{}) {
return s.Val
}
//LoadValue need load value
func (s *CacheBaseLoader) LoadValue(c context.Context) (value interface{}, err error) {
panic("implement me")
}
//Expire expiration
func (s *CacheBaseLoader) Expire() time.Duration {
return time.Duration(conf.Conf.Memcache.McnDataCacheExpire)
}
//Desc key desc
func (s *CacheBaseLoader) Desc() string {
return s.desc
}
// -----------------------------------------
//LoadFuncWithTp sign with type
type LoadFuncWithTp func(c context.Context, signID int64, date time.Time, tp string) (res interface{}, err error)
//LoadFuncOnlySign only sign
type LoadFuncOnlySign func(c context.Context, signID int64, date time.Time) (res interface{}, err error)
//NewCacheMcnDataWithTp reply
func NewCacheMcnDataWithTp(signID int64, date time.Time, tp string, val interface{}, desc string, loadFunc LoadFuncWithTp) *cacheMcnDataWithTp {
return &cacheMcnDataWithTp{
CacheBaseLoader: newCacheBaseLoader(signID, date, val, desc),
Tp: tp,
LoadFunc: loadFunc,
}
}
//cacheMcnDataWithTp cache
type cacheMcnDataWithTp struct {
CacheBaseLoader
Tp string
LoadFunc LoadFuncWithTp
}
//Key key
func (s *cacheMcnDataWithTp) Key() (key string) {
return fmt.Sprintf("%s_%d_%s_%s", s.Desc(), s.SignID, s.Date.Format(dateFmt), s.Tp)
}
//LoadValue load
func (s *cacheMcnDataWithTp) LoadValue(c context.Context) (value interface{}, err error) {
value, err = s.LoadFunc(c, s.SignID, s.Date, s.Tp)
if err != nil {
s.Val = nil
return
}
if sorter, ok := value.(mcnmodel.Sorter); ok {
sorter.Sort()
}
// 如果s.Val存在则将结果populate到s.Val上因为外部会直接使用原始传入的s.Val值
if s.Val != nil {
var b, _ = json.Marshal(value)
json.Unmarshal(b, s.Val)
}
return
}
// NewCacheMcnDataSignID 请求只有sign id的情况
func NewCacheMcnDataSignID(signID int64, date time.Time, val interface{}, desc string, loadFunc LoadFuncOnlySign) *cacheMcnDataSignID {
return &cacheMcnDataSignID{
CacheBaseLoader: newCacheBaseLoader(signID, date, val, desc),
LoadFunc: loadFunc,
}
}
type cacheMcnDataSignID struct {
CacheBaseLoader
LoadFunc LoadFuncOnlySign
}
//Key key
func (s *cacheMcnDataSignID) Key() (key string) {
return fmt.Sprintf("%s_%d_%s", s.Desc(), s.SignID, s.Date.Format(dateFmt))
}
//LoadValue load
func (s *cacheMcnDataSignID) LoadValue(c context.Context) (value interface{}, err error) {
value, err = s.LoadFunc(c, s.SignID, s.Date)
if err != nil {
s.Val = nil
return
}
if sorter, ok := value.(mcnmodel.Sorter); ok {
sorter.Sort()
}
// 如果s.Val存在则将结果populate到s.Val上因为外部会直接使用原始传入的s.Val值
if s.Val != nil {
var b, _ = json.Marshal(value)
json.Unmarshal(b, s.Val)
}
return
}