You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
3.9 KiB
152 lines
3.9 KiB
package cms |
|
|
|
import ( |
|
"context" |
|
|
|
"fmt" |
|
"go-common/app/interface/main/tv/model" |
|
"go-common/library/cache/memcache" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_mcSnCMSKey = "sn_cms_%d" |
|
_mcEPCMSKey = "ep_cms_%d" |
|
) |
|
|
|
func snCMSCacheKey(sid int64) string { |
|
return fmt.Sprintf(_mcSnCMSKey, sid) |
|
} |
|
|
|
func epCMSCacheKey(epid int64) string { |
|
return fmt.Sprintf(_mcEPCMSKey, epid) |
|
} |
|
|
|
func keysTreat(ids []int64, keyFunc func(int64) string) (idmap map[string]int64, allKeys []string) { |
|
idmap = make(map[string]int64, len(ids)) |
|
for _, id := range ids { |
|
k := keyFunc(id) |
|
allKeys = append(allKeys, k) |
|
idmap[k] = id |
|
} |
|
return |
|
} |
|
|
|
func missedTreat(idmap map[string]int64, lenCached int) (missed []int64) { |
|
missed = make([]int64, 0, len(idmap)) |
|
for _, id := range idmap { |
|
missed = append(missed, id) |
|
} |
|
missedCount.Add("tv-meta", int64(len(missed))) |
|
cachedCount.Add("tv-meta", int64(lenCached)) |
|
return |
|
} |
|
|
|
// SeasonsMetaCache season cms meta cache |
|
func (d *Dao) SeasonsMetaCache(c context.Context, ids []int64) (cached map[int64]*model.SeasonCMS, missed []int64, err error) { |
|
if len(ids) == 0 { |
|
return |
|
} |
|
cached = make(map[int64]*model.SeasonCMS, len(ids)) |
|
idmap, allKeys := keysTreat(ids, snCMSCacheKey) |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
replys, err := conn.GetMulti(allKeys) |
|
if err != nil { |
|
PromError("mc:获取Season信息缓存") |
|
log.Error("conn.Gets(%v) error(%v)", allKeys, err) |
|
err = nil |
|
return |
|
} |
|
for key, item := range replys { |
|
art := &model.SeasonCMS{} |
|
if err = conn.Scan(item, art); err != nil { |
|
PromError("mc:获取Season信息缓存json解析") |
|
log.Error("item.Scan(%s) error(%v)", item.Value, err) |
|
err = nil |
|
continue |
|
} |
|
cached[idmap[key]] = art |
|
delete(idmap, key) |
|
} |
|
missed = missedTreat(idmap, len(cached)) |
|
return |
|
} |
|
|
|
// EpMetaCache season cms meta cache |
|
func (d *Dao) EpMetaCache(c context.Context, ids []int64) (cached map[int64]*model.EpCMS, missed []int64, err error) { |
|
if len(ids) == 0 { |
|
return |
|
} |
|
cached = make(map[int64]*model.EpCMS, len(ids)) |
|
allKeys := make([]string, 0, len(ids)) |
|
idmap := make(map[string]int64, len(ids)) |
|
for _, id := range ids { |
|
k := epCMSCacheKey(id) |
|
allKeys = append(allKeys, k) |
|
idmap[k] = id |
|
} |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
replys, err := conn.GetMulti(allKeys) |
|
if err != nil { |
|
PromError("mc:获取EP信息缓存") |
|
log.Error("conn.Gets(%v) error(%v)", allKeys, err) |
|
err = nil |
|
return |
|
} |
|
for key, item := range replys { |
|
art := &model.EpCMS{} |
|
if err = conn.Scan(item, art); err != nil { |
|
PromError("mc:获取EP信息缓存json解析") |
|
log.Error("item.Scan(%s) error(%v)", item.Value, err) |
|
err = nil |
|
continue |
|
} |
|
cached[idmap[key]] = art |
|
delete(idmap, key) |
|
} |
|
missed = make([]int64, 0, len(idmap)) |
|
for _, id := range idmap { |
|
missed = append(missed, int64(id)) |
|
} |
|
missedCount.Add("tv-meta", int64(len(missed))) |
|
cachedCount.Add("tv-meta", int64(len(cached))) |
|
return |
|
} |
|
|
|
//AddSeasonMetaCache add season meta cache |
|
func (d *Dao) AddSeasonMetaCache(c context.Context, vs ...*model.SeasonCMS) (err error) { |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
for _, v := range vs { |
|
if v == nil { |
|
continue |
|
} |
|
item := &memcache.Item{Key: snCMSCacheKey(v.SeasonID), Object: v, Flags: memcache.FlagJSON, Expiration: d.expireCMS} |
|
if err = conn.Set(item); err != nil { |
|
PromError("mc:增加Season信息缓存") |
|
log.Error("conn.Store(%s) error(%v)", snCMSCacheKey(v.SeasonID), err) |
|
return |
|
} |
|
} |
|
return |
|
} |
|
|
|
//AddEpMetaCache add ep meta cache |
|
func (d *Dao) AddEpMetaCache(c context.Context, vs ...*model.EpCMS) (err error) { |
|
conn := d.mc.Get(c) |
|
defer conn.Close() |
|
for _, v := range vs { |
|
if v == nil { |
|
continue |
|
} |
|
item := &memcache.Item{Key: epCMSCacheKey(v.EPID), Object: v, Flags: memcache.FlagJSON, Expiration: d.expireCMS} |
|
if err = conn.Set(item); err != nil { |
|
PromError("mc:增加EP信息缓存") |
|
log.Error("conn.Store(%s) error(%v)", epCMSCacheKey(v.EPID), err) |
|
return |
|
} |
|
} |
|
return |
|
}
|
|
|