bilibili-backup/app/interface/main/mcn/dao/datadao/cache.go
2019-04-22 02:59:20 +00:00

144 lines
3.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}